C++相談室 part141

■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/02/26(火) 00:22:22.81ID:kx+LOcr9
>>40-41
10^300 とかまで大丈夫だって思ってはいけないのですね
初めて理解しました
43デフォルトの名無しさん
垢版 |
2019/02/26(火) 14:43:31.98ID:8+7ktUtN
桁落ち
2019/02/26(火) 15:56:22.96ID:5MxkS3P7
浮動小数点は元々、誤差があるから、大雑把な数値でよい

正確な数値を求める場合は、整数型か、decimal を使う
2019/02/26(火) 16:22:19.66ID:aKbIPEAT
>>32
同じ関数で、MFC 版と Win32 版があることがあり、混乱が生じて、
切り分けの難しい不具合を生じる可能性を避けるため、そうしている。

C++だと、実引数を省略することもできる場合があり、その場合、Win32版を
使っているつもりが、MFC版が勝手に呼び出されて、動作が自分の思ったものと
少し違ってしまう可能性があるかもしれない。この時、コンパイラは何の
警告も出してくれないかもしれない。それを避けたいため、絶対に
Win32版を呼び出したい場合には、:: を付けることがある。
46デフォルトの名無しさん
垢版 |
2019/02/26(火) 19:26:51.90ID:7oeDt7bv
DoxygenがモダンC++に対応していないんだけど、何か代わりの物はありますか?
2019/02/26(火) 22:24:56.64ID:t7v3BAso
キーボードのPageUpとPageDownの使い方が判りません、他のボタンも。
48デフォルトの名無しさん
垢版 |
2019/02/26(火) 23:24:35.69ID:S/5yarce
C++のthreadってOSの無いマイコン環境でも動作するんだろうか?
threadが使えるってことは、ハードウエア的に最低でもタイマー割り込みを使う必要が
あるんじゃなかろうか? そうするとそういうタイマーなどのハードリソースはすべて自前で
用意するというのが前提のマイコンではどうするんだろとふと疑問に思った。
2019/02/27(水) 01:13:25.57ID:FtVEDFBt
>>48
どうにもならんのじゃない?
仕様に完全準拠した処理系 (ライブラリ) は提供できんってだけだろ。
50デフォルトの名無しさん
垢版 |
2019/02/27(水) 01:32:45.56ID:apYcTfdI
effective Modern C++ / Scott Meyersには
C++11の偉業として
 C++の平行対応作業の大部分がコンパイラ開発側が負担する形で実現されたおかげで、標準
規格としてC++の歴史上はじめてどのプラットフォームでも動作が変わらないマルチスレッドプログラム
の開発が可能となりました。
と書かれている。
「どのプラットフォームでも」と書かれているがOSのないマイコンだってプラットフォームだからそれを含まない
と可笑しいとおもうが、、
2019/02/27(水) 01:37:31.77ID:3Jl+ieqT
>>50
そこは、対応しているプラットフォームでは、という前提がつくのは自明だと思うぞ、
2019/02/27(水) 01:59:24.57ID:VmfRF6bC
>>46
例えば何に対応してないの?
2019/02/27(水) 09:01:57.37ID:MitD/HmJ
そもそも、マイコンにスレッドなんてあるのか?

main 関数しか無いのでは?
2019/02/27(水) 09:20:12.60ID:fYEBa3GD
マイコンには関数も変数も無いだろ
機械語セットのどこにも関数とか変数とかの命令は無いじゃん
変数が存在してるように見えるのはコンパイラのおかげ
2019/02/27(水) 12:06:10.51ID:FtVEDFBt
C/C++ というのはそういうランタイムサポートが期待できない環境、いわゆる「ベアメタル」でも使い物になる
システムプログラミング言語であるというのがキモの言語だろ。
フルセットで使える環境なら std::thread という共通インターフェイスを使ってねというだけのことで、
リソースが限られたアーキテクチャでもフルセットが使えるべきというほどのもんではない。
2019/02/27(水) 12:51:06.39ID:Gf38Q9uK
>>48
(組み込みの)マイコンでは、普通、single thread なんじゃないかな。
マルチスレッドを使えるOSを作るのは結構複雑。

>>53
そういうOSをマイコンに作れば使えるようにはなるだろうけど、そこまでは
やってないことも多いと思う。そもそもマルチスレッドはプログラミングが
複雑になり予想も難しくなるのでバグが入り易い。カメラや炊飯器が誤動作して
も困る。
57デフォルトの名無しさん
垢版 |
2019/02/27(水) 14:09:36.66ID:+TCpifLa
>>53
mainが無いのもあった気がする
58デフォルトの名無しさん
垢版 |
2019/02/27(水) 15:17:57.76ID:6BQDuKk1
>>53
PCよりテヘロジニアス化(専用機をCPUに統合)が進んでるので、GPGPUみたいな感じってネットで読んだことあるな。
2019/02/27(水) 15:37:08.27ID:HrTieKXO
>>56
どんなマイコンを想像してるのか知らんけど組込みOSならメモリー数KB程度から動作する
https://www.eforce.co.jp/products/microc3c

>>57
mainなんて単なるC言語とかのお約束だからスタートアップルーチンに手を入れられるなら変えることはいくらでもできるよ
2019/02/27(水) 15:48:15.61ID:jy5tl2qf
サービスなんてエントリーポイント2つあるし
2019/02/27(水) 18:55:35.12ID:BQO9B3mv
template<class T>
int print(T v)
{
 printf("%d",v);// intの場合
 printf("%lf",v);// doubleの場合
}

printfを使うことは必須なんですが、どうすれば実現できます?
2019/02/27(水) 19:11:05.97ID:qHrg9QHU
特殊化しよう
2019/02/27(水) 19:14:17.63ID:lylxu9As
typeidで分岐すれば
64デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:17:04.78ID:ZZbXSlBN
>>52
戻り値の型をautoと書くとオーバーロードを認識しなくなるとかです。
2019/02/27(水) 19:23:09.27ID:lylxu9As
auto戻り値なんてメリットあるか?
2019/02/27(水) 19:31:54.53ID:EHh9wz5w
コンパイル時の条件で型が変わるときはautoで済ますと楽
2019/02/27(水) 19:43:36.93ID:1o0vhyUy
>>61
単純にオーバーロードすれば?
68デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:53:26.31ID:ZZbXSlBN
>>65
decltype使うときとかです。
69デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:56:24.14ID:ZZbXSlBN
std::enable_if<>を使うと超長くなるんだけど、doxygenは戻り値の型の欄を改行してくれないので、関数名や説明の欄が横一文字とかになってしまいそうです。
何とかしてほしいです。
70デフォルトの名無しさん
垢版 |
2019/02/27(水) 20:23:21.57ID:Lz5cBdad
>>65
constexpr auto succ(auto num) {
return ++num;
}
2019/02/27(水) 20:31:28.87ID:ajs1Ye6I
>>61
%lfて…わかってやってる、ワケないよな
2019/02/27(水) 20:40:31.82ID:G+GrvvOb
>>61
printf("%s", std::string(v).c_str());
2019/02/27(水) 20:45:05.91ID:G+GrvvOb
>>72
ミスった
std::stringじゃなくてstd::to_stringが正しい
2019/02/28(木) 07:48:59.08ID:nAsBylgf
なるほど、まず文字列に変換、統一してから %s で表示か。
>>62 の「テンプレート関数の特殊化」を教える例題って説も納得いくけど、
std::string の変換関数の好例でもあるな。

>>71 %lf は規格で認められてる変換指定だね、一応。
間違って使う奴があまりに多いので現状追認で追加された、
という経緯らしいけど。
どうやら C90 では未定義、C99以降は %f と同様みたい。
75デフォルトの名無しさん
垢版 |
2019/02/28(木) 12:32:13.81ID:yyOtWed3
>>73
%06d とか %7.3f とかできなくなるやん
7672
垢版 |
2019/02/28(木) 13:07:02.05ID:g9ECmttI
>>75
質問主がデフォルトの書式だからとりあえずそのままで書いた
型ごとに書式を指定するなら上にもあるように特殊化するしかないな
7774
垢版 |
2019/02/28(木) 15:32:45.18ID:nAsBylgf
自分で書いといてアレだけど、
C++に含まれるCの標準関数ってどうなってるんだろ?
Cの規格に追従して自動的に更新されてくのか、
ある時点で分裂したら再統合されるまで離れる一方なのか。

後者だとしたら、C99以降でprintf()の%lfが正当になったとしても
C++に関してはどのバージョンでも未定義、って危険があるな。
2019/02/28(木) 16:24:48.52ID:KlP/6TOW
>>77
今のところつかず離れずを維持してる。
C++ 中の C 関数は「この C 規格を参照」という感じで明記しているので、
ある程度になると状況を見て参照先を変更するってだけ。

まあ関数についてはそれでいいとして、
その他のところも記法は統一して欲しいよなぁ。

C の _Noreturn と C++ の [[noreturn]] はどっちかに統一するのじゃ駄目だったんかなぁ? とか。
2019/02/28(木) 17:54:53.03ID:zeNaE6xz
vector<object*> v
がありまして、んでobjectクラスはメンバ変数int numを持ってるとします
このときですねv.at(1)->num, v.at(2)->num,....v.at(n)->numでvをsortしたいなーってのがあるんですけど上手い方法無いもんでしょうか
全然思いつかなくて
2019/02/28(木) 18:01:05.88ID:3CdGs56r
>>78
そう言うのは好みだからどっちかが大人になって折れるかよほど力の差があるとかでないと統合は無理
2019/02/28(木) 18:07:46.80ID:zeNaE6xz
>>79ですが解決しました。失礼しました。
https://stackoverflow.com/questions/16366978/stdsort-on-a-vector-of-class-pointers
こちらですね
82デフォルトの名無しさん
垢版 |
2019/02/28(木) 18:41:06.34ID:IByT54N8
英語だ!!!
2019/02/28(木) 20:13:33.80ID:FII1Vkt+
>>61
確か double に対応する書式指定は "%f" であって "%lf" ではない、という記憶がありますが
2019/02/28(木) 20:22:30.93ID:SJVUajxC
K&Rのfloatは引数にするとdoubleに昇格するというルールが残っているのでしょう
2019/02/28(木) 23:35:18.37ID:IM+bn+eP
本質ではなく、どうでもいいところにしか突っ込めないんだなw
2019/02/28(木) 23:37:27.00ID:ufQTgCzR
プロトタイプ宣言されたfloat引数にはfloatで渡すけど
可変引数にはfloatは渡せないままなんだな何故か
2019/02/28(木) 23:45:49.79ID:SJVUajxC
>>86
va_list にそんな制限あったっけ?
2019/02/28(木) 23:51:53.97ID:LhFhdmbG
可変長引数関連はスタック周りを弄るコードを「マクロで」wrapしたものだから
C言語と互換性を持たせるためには仕様の詳細まで引き継ぐしか致し方なかったんじゃないの知らんけど

C++専用のva_listを名前を変えて作ったら解決したかもしれんが
知らんけど

ただしそうしたとしたら、extern "C"したのにC言語から呼ばれへん
何で!?となってプチ大混乱が生じそう
知らんけどな…
2019/02/28(木) 23:53:46.30ID:LhFhdmbG
printf()ではdoubleを出力できるのに、
scanf()ではfloatしか受け取れない(doubleをスキャンする機能が無い)というのは
C言語の七不思議のうちの一つ
2019/02/28(木) 23:56:03.03ID:SJVUajxC
MSDNの関連記事 読んでない
https://msdn.microsoft.com/ja-jp/magazine/dn913181.aspx
2019/03/01(金) 00:15:41.73ID:fP7U0W+N
しかしさすがにscanf()でdoubleをスキャンできるようにする近代化は一筋縄ではいかなさげ
92デフォルトの名無しさん
垢版 |
2019/03/01(金) 13:14:40.93ID:ozM8zBQ9
>>89
えっ
2019/03/01(金) 19:20:57.20ID:HVxvwZsK
>>84
不定長引数関数ならば、という縛りがつきます
2019/03/01(金) 19:21:39.88ID:HVxvwZsK
>>91
普通に書式"%lf" でできるのではないですか?
2019/03/01(金) 19:33:29.87ID:WfqePbUu
>>89
それ何処の世界のC言語の話?
2019/03/01(金) 20:08:46.93ID:WfqePbUu
>>87
規格に書いてあるよ
97デフォルトの名無しさん
垢版 |
2019/03/02(土) 10:59:08.67ID:+L4gK20K
出鱈目ばっかり書き込むスレですか?
2019/03/02(土) 11:55:35.34ID:0O78HlO0
>>93
できた!できたわ>>93素敵!!!11!!
2019/03/02(土) 12:04:22.76ID:0O78HlO0
ところで質問なのですが代入やコピー構築時に所有権を移動するクラスFooを造りたいのですが、
Foo::Foo(Foo& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; } // 引数が非constのコピコン
Foo& Foo::operator=(Foo& rhs) { m_p = rhs.m_p; rhs.m_p = NULL; return *this; } // 引数が非constの代入演算子
を定義して、VS2010とかで警告レベルを4に引き上げると
 C4239TypeからType&への変換です
という警告が出るのです

これはFooのムーブコンストラクタを定義したら直るので初めてムーブコンストラクタを定義したいのですが、そこで質問

Q1. ムーブコンストラクタにおいてはコピーされる側の変更はマジで不要?
   つまり、所有権移動が絡む今回のFooの場合でも次の書き方でおk?
Foo::Foo(const Foo&& rhs) : m_p(rhs.m_p) { }

Q2. ムーブコンストラクタにおいてコピーされる側を変更しても(実行効率以外は)無害?
   つまり、所有権移動が絡む今回のFooの場合でコピコンにならって次の書き方をしても安全?
Foo::Foo(Foo&& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; }
2019/03/02(土) 12:09:49.85ID:0O78HlO0
訂正orz
>>98
誤: >>93
生: >>94

>>99
誤: コピーされる側
正: ムーブされる側
2019/03/02(土) 12:23:27.09ID:LLfR4tsY
rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
一時オブジェクトだろうが何だろうが破棄されるときにデストラクタは走るから、
その例だとNULL入れる必要はある

というかその例は綺麗にムーブを使うべき例
2019/03/02(土) 12:37:35.01ID:0O78HlO0
>>101
>rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
なるほど確かに…
ていうか鋭い

>というかその例は綺麗にムーブを使うべき例
ホンマや(゚Д゚;)ムーブコンストラだけで動いたわdクス、
2019/03/02(土) 12:51:51.79ID:0O78HlO0
実験してから質問せいやというご批判があるかもしれないので釈明
実験はした
しかしコピコンが定義されているとムーブコンは呼ばれなかった(から、>>99のQ1のムーブコンでもちゃんとイゴイタ)のである
104デフォルトの名無しさん
垢版 |
2019/03/02(土) 14:47:21.97ID:66qf4QbX
えw
実験するのめんどくさいから質問してたわw
ダメだったんだ、ごめんなさい。
2019/03/02(土) 15:15:55.45ID:oy0Ht86m
コンパイルエラーがとれなくて困ってます

■ ヘッダー側
template<class T>
class Test
{
public:
  Test(void (*func)(T)) {}
  Test(void (*func)(const T&)) {}
};
typedef Test<int *> TestPtr; // テンプレート引数がポインタ型

■ 呼び出し側
static void func1(int *x) {}
static void func2(const int *x) {}

void main()
{
  TestPtr test1(func1); // OK
  TestPtr test2(func2); // コンパイルエラー
}

VC2008だと以下のエラーになります。
1 番目の引数を 'void (__cdecl *)(const int *)' から 'void (__cdecl *)(T)' に変換できません。

func2みたいにconst付けるとなんでダメなんでしょうか?
2019/03/02(土) 15:52:41.75ID:0ZOGECoI
>>104
実験もせずに待つって、マナー以前に自分のためにならんだろ
答えが返ってくるまでボケっとしてんのかと

>>105
関数ポインタは引数の型が違うと別の型になる
107デフォルトの名無しさん
垢版 |
2019/03/02(土) 15:54:45.54ID:uEwpVDqh
VC++でmsado15.dllをインポートしようとしても参照されずエラーになるのですが原因は何でしょうか?
2019/03/02(土) 16:25:34.65ID:gxSP/QDn
>>107
それだけでわかるか。エラー内容くらい書け
109デフォルトの名無しさん
垢版 |
2019/03/02(土) 16:41:21.42ID:uEwpVDqh
>>108
C:\Program Files\Common Files\system\ado\msado15.dll に対応するエディターはありません。

このファイルの種類(.dll)のアプリケーションがインストールされていることを確認してください。


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E1696 ソース ファイルを開けません "C:/Users/owner/Documents/Visual Studio 2017/Projects/20190227/20190227/Debug/msado15.tlh" 20190227 C:\Users\owner\Documents\Visual Studio 2017\Projects\20190227\20190227\Source.cpp 6

ソースは以下の通り
#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
#import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
2019/03/02(土) 17:30:18.82ID:oy0Ht86m
>>106
なるほど。
typedef Test<const int *> TestPtr;
にしたらコンパイル通りました!どもです!
111デフォルトの名無しさん
垢版 |
2019/03/02(土) 18:12:08.54ID:uEwpVDqh
>>109
必要かどうかわからなかったのですが
regsvr32.exeでmsado15.dllを登録

その後いろいろいじってビルドしてみるとコンパイルできました。
ただし出力ができませんでしたがコンパイルはできたのでとりあえず良しとします。

msado15.dllのようなDLLはC(VC)++で扱うのは難しいですね。
インテリセンスが働きませんから…
2019/03/02(土) 18:48:27.86ID:Gk4CLPf8
「c++ import dll」で検索!
2019/03/02(土) 20:32:59.25ID:YCnAoXOq
マクロは名前空間無いからな
2019/03/02(土) 22:58:26.16ID:9ABljqhX
はじめまして。
C++でスケジューラのようなものを作りたいのですが、
相談に乗っていただけますでしょうか?

C++/MFCのMDIを使用して、ウィンドウ内に複数のウィンドウを配置したいと思っています。
一つのウィンドウにはリスト形式でタスクの一覧を、別のウィンドウでは
ガントチャート形式でタスクの時間ごとにグラフを描画し、その他のウィンドウは各情報を表示出来ればと思っています。

そこで、上記のようなものを作るにあたって、
タスク一覧のウィンドウとガントチャートのウィンドウへドラッグ&ドロップで行き来したいのですが、
そもそもそのような事は可能でしょうか?

また、チャートの描画をするにあたって、グラフは2Dで描画しようと思っているのですが、
2Dのグラフィックライブラリ等を利用した方が簡単に実装出来るでしょうか?
もし良いライブラリ等があればご教示いたければ幸いです。

私自身、開発言語はC++かC#しかまともに使用した経験がないのですが、
実行環境のスペックがあまり高いものを準備出来ないので、
Core2Duo/メモリ2G程度、良くても型落ちのi3程度で、
実行速度も考慮したくC++を選択した次第です。
もし最適な言語や、開発手法があれば教えていただけると嬉しいです。

無知な部分が多いと思いますが、皆さんの意見をお聞かせ頂ければと思いますので、よろしくお願いいたします。
2019/03/02(土) 23:07:26.95ID:HH5zv832
それなら、OLE D&Dを実装することになる。具体的には、IDataObject, IDataSource, IDropTargetインターフェースの実装。
116デフォルトの名無しさん
垢版 |
2019/03/02(土) 23:32:17.29ID:4PbQivqk
c++でテンプレ使って実装を別ファイルで隠す場合、

// h //////////////////////////////////////////////////
template<typename T> class cls
{
public:
template<typename U> U func();
private:
T var = 0;
};

// cpp1 //////////////////////////////////////////////////
template<> template<> char cls<char>::func<char> { return var; }
template<> template<> int cls<char>::func<int> { return var; }
template<> template<> char cls<int>::func<char> { return var; }
template<> template<> int cls<int>::func<int> { return var; }

// cpp2 //////////////////////////////////////////////////
template<typename T> template<> char cls<T>::func<char>(){ return var; }
template<typename T> template<> int cls<T>::func<int>(){ return var; }
template<> class cls<char>;
template<> class cls<int>;

//////////////////////////////////////////////////

cpp1みたいに全部型指定していく場合はビルド出来るんだけど、
cpp2みたいに別けて型指定していくと出来ない。

cpp2みたいな事を実現可能な方法って無いですかね?
そもそも書き方が間違ってる?
2019/03/02(土) 23:37:15.79ID:HH5zv832
ヘッダーで特殊化の方法を指定しないといかんとちゃう? 知らんけど。
2019/03/02(土) 23:45:00.12ID:0O78HlO0
cls::func()の定義を
 U cls::func()
ではなしに、
 void cls::func(U& x)
とかにすればおkなキモス、

なおそうするとテンプレートの特殊化以前に関数のオーバーロードで解決できてしまうヨカン、
void cls::func(char& x) { x = (char)var; }
void cls::func(int& x) { x = (int)var; }
void cls::func(double& x) { x = (double)var; }
void cls::func(std::string& x) { x = std::string(var, '0'); }
...
いくらでも作れる……!
2019/03/02(土) 23:54:10.30ID:HH5zv832
IDataSourceじゃなくてIDropSourceだ。ごめんを。
120デフォルトの名無しさん
垢版 |
2019/03/02(土) 23:59:54.93ID:4PbQivqk
>>117
特殊化の方法、、、私の知識では分からないですね、、、

>>118
hを、
template<typename U> void func(U& dest);
cppを、
template<typename T> template<> void cls<T>::func(char& dest){ dest = var; }
としてみましたが、状況は変わらずでした。


これ、全組み合わせを書かなきゃダメなんですかね?
template<T, U> みたいなのを、
template<T, int> みたいな感じで一部だけ型指定していくのは無理、
というのは見た事があります。
2019/03/03(日) 00:04:53.16ID:KlFuUPR7
特殊化を知らない?
2019/03/03(日) 00:12:10.08ID:ET38y2ec
cpp2の翻訳単位内で完全に実体化させないとどうやっても外からはよべないので
少なくともcpp2の中ではそのように書かないといけないと思う
2019/03/03(日) 00:24:16.88ID:kd4WdA4I
確実にcppに実体作りたきゃ明示的インスタンス化は個別にしなきゃ駄目だろ
2019/03/03(日) 00:24:32.19ID:1zX/ygG4
>>121
この場合の特殊化は、どのような記述になるのでしょうか?

>>122
なるほど、やっぱり無理なんですかね?


これ、元となっているのは、

// h /////////////////////////////////////////////////
template<typename T> class cls
{
public:
int func();
private:
T var;
};

// cpp ////////////////////////////////////////////////////
template<typename T> int cls<T>::func(){ return var; }
template class cls<char>;

/////////////////////////////////////////////////////////////

みたいな感じで func() に戻り値の型指定を追加したいな、
って事でやりはじめたんですよね。

綺麗に書くのが無理そうならば、必要な物を全部書いていきます、、、
2019/03/03(日) 00:30:05.53ID:AQaNwhGs
要求仕様がいまいちよくわかっていないが(マテ
(1) 任意の型Tの値cls::varから任意の型Uの値を得たい(一種のconverterクラスを作りたい)
(2) 変換関数cls::func()の実装は隠蔽したい

ということならこんなんでど(ry
ttps://ideone.com/1Fh8sg
2019/03/03(日) 00:38:22.33ID:1zX/ygG4
>>123
やっぱりそういう物なのですかね

>>125
仕様はそんな感じです
ただ、func() の戻り値をテンプレ使用でなんとかする方法が無いのかな、と
サンプルもありがとうございます
2019/03/03(日) 00:49:52.61ID:AQaNwhGs
>func() の戻り値をテンプレ使用でなんとかする方法が無いのかな、と
func()の戻り値をテンプレにしつつ実装は「完全に」隠蔽したい(ヘッダファイルに書くわけにいかない)となると
やっぱコアとなる変換関数は、必要なTとUの全組み合わせについて「完全に」「非テンプレートで」書かないといけない希ガス
(なぜなら、テンプレートのままcppに書いたら他のcppから呼べない(現行コンパイラはテンプレートの分割コンパイルに対応していない

(2)の隠蔽の要求を多少緩和して、template<class U> void conv(int src, U& dst) { ... } を
ヘッダファイルに書いても良いということならUを返すcls::func()をconv()を1個書いたらできるようにはなる

※ 個人の感想です
※ コードには個人差があります
2019/03/03(日) 00:57:11.45ID:1zX/ygG4
>>127
となると、現在のやり方でコードを完全隠蔽したいとなると、
全組み合わせをcppに書けって事になりますよね、、、


なるほど、了解いたしました
付き合って頂いた皆様、ありがとうございます
2019/03/03(日) 01:15:53.21ID:AQaNwhGs
スマン>>127は言い過ぎたかもしれん…
全組み合わせをcppに書く作業をそのcppの中でテンプレートを定義して省力化することは可能かもしれん
ただし、そのcppの中で定義したのと同じシグネチャ(名前+引数)でユーザーコードが別のテンプレート関数を定義でもしたら、
ODRに違反することになる(この場合実際に変な挙動になる危険性が大きい)ので全体を無名namespaceで囲う必要がありそう
無名namespaceの中から選択的に関数をエクスポートできるのかは正直知らん
あんまりテンプレート絡みで無茶はやりたくナサス
2019/03/03(日) 01:30:06.83ID:kd4WdA4I
定義は共通でして
template int cls<char>::func<int>();
みたいなのを使う分だけ書けば良い

ただ、今回の場合クラス内テンプレート関数の特殊化しようとすると怒られるからさらに工夫が必要
2019/03/03(日) 01:33:24.30ID:ET38y2ec
ああ、確かに
使わない関数テンプレートをcppで定義してそれの明示的インスタンス化を通してやれば省力化できそう
この場合その使わない関数テンプレートを内部リンケージにしても、その中で実体化要求されたテンプレートのリンケージには影響はないはず
2019/03/03(日) 02:24:28.96ID:5EsDLzeQ
Visual Studioで通ってもgccで通らなかったりするからテンプレートの実体化は厄介。
2019/03/03(日) 02:47:42.46ID:dVINV85+
もはやコンパイラありきの言語
2019/03/03(日) 02:53:02.86ID:kd4WdA4I
VC++がC++擬きの別言語なだけだろ
今ごろになってやっと2 phase lookup対応させた

structとclassが違うとリンクでこけるのも糞
2019/03/03(日) 03:13:19.05ID:ET38y2ec
VS2017以降のMSVCは許してあげてほしい・・・
136デフォルトの名無しさん
垢版 |
2019/03/03(日) 05:50:17.03ID:EorZPwcP
えっ、何か革新的なことをしているの?
C++は今までつかったことがなかったんだが、最近マイコンの開発に使ってから
かなり気に入っている。これならPCでも使えるかもと今考えているところ。
137デフォルトの名無しさん
垢版 |
2019/03/03(日) 06:33:00.88ID:ChZC+e8W
組み込み用途だとC++よりCの方が融通効くと思うんだが
最近の組み込みはひょっとして随分恵まれてるのか
2019/03/03(日) 07:57:12.43ID:EUJr/Yte
>>137
お前さんの認識が古いだけ
数KBメモリーとモダンなプロセッサならC++で開発は普通にできる
2019/03/03(日) 10:05:41.46ID:OccEVyH1
ふと思ったんですが、Java でデコレーターを記述するのに
BufferedReader br = new BufferedReader(new InpustStreamReader(System.in));
などと、new したオブジェクトのポインタを取っておかず、new したまま放置してしまう書き方がありますが、
スコープ内で new したオブジェクトは、スコープを外れるときに C++翻訳系が自分で delete する、と決め打ちしてしまうと、互換性で問題がでるでしょうか?
2019/03/03(日) 10:18:54.68ID:0vjeZZiI
そのポインタを別の場所にコピーしてたらどうなる?
頭悪すぎだろ
2019/03/03(日) 10:23:45.41ID:OccEVyH1
>>140
では、あからさまに new したポインタを捨ててしまっている記述に限り自動で delete する、というのはどうですか?
目的は…classpath を共用したいのです、classpath はあらたに c++ で書くとして
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況