X



C++相談室 part138
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (スフッ Sd9f-fGne)
垢版 |
2018/08/05(日) 18:02:36.57ID:DigzqJtZd
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137
http://mevius.5ch.net/test/read.cgi/tech/1531558382/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
http://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
0066デフォルトの名無しさん (ワッチョイ 174f-9b2l)
垢版 |
2018/09/19(水) 12:58:39.27ID:GJOADTEF0
>>65
ああ、目の付け所はそこで合ってる。
先に言っておこうかとも思ったが、話が無駄にずれるので止めておいた。

わざわざコンテナを作ったのは、コンテナ領域をallocaで確保したかったから。
そこに結果的に placement new して、ヒープ領域にデータ領域を持ったオブジェクトを配置してる。
だからそれらを解放してくれないと不味い。
そのデストラクタをコンテナのデストラクタからキックしている。
(というか、これをやらせる為に簡易コンテナにした。
単にallocaで可変長配列を確保してその中に入れただけでは、
デストラクタを起動するコードが『自前で、上位側に』必要であり、これがC++の思想と反するから)

要するに alloca をもっと使ってみようというテストなのだが、
「コンストラクタで領域を確保出来ない」(関数呼び出しでは初期化出来ない)のが地味に使えない。
C++は何故か forceinline までも「無視していい」という仕様にしているようだし。
(inlineは無視してもよく、forceinlineは無視しては駄目、という仕様に普通はするだろ)

ただ、自作アロケータを既存のコンテナにはめ込めるのなら、その方がいい。
この解があるなら alloca がいらない子扱いなのも道理だ。
0069デフォルトの名無しさん (ワッチョイ 174f-9b2l)
垢版 |
2018/09/19(水) 18:54:14.05ID:GJOADTEF0
>>67
駄目だな。
仮想関数にしないといけないのと、
それは子が子のままでいられるだけであって、子が親のメソッドを使った後も子で居続けられるわけでない。

> 実際に取得する型が親クラスに引っ張られないメリットを享受できる
> 自分自身の型を返す関数を定義する時など、親クラス固定だと、受け取った側でのキャストが面倒ですしね。
> http://cpp.aquariuscode.com/covariant-type
やはり既知の問題ではないか。

(C++しか使ったことがないなら意味が分からないと思うが)
JavaScriptの場合はクラス階層とインスタンス階層が分離しており、
各インスタンスはクラス階層を派生させてを作る。
だから元々親階層のメソッドから子階層のメンバ変数を参照出来るし、それがデフォの使い方だ。

クラス階層とインスタンス階層は文法的には違いが無く、クラスも継承出来るが、インスタンスも継承出来る。
これを上手く使えば、メモリを大幅に節約することが出来る。
C++にはこの記述能力がない。
理由はクラスとインスタンスが明確に分離しているからだ。

JavaScriptの挙動をC++用語で言えば、
thisが常に仮想thisであり、メンバ変数は全部仮想メンバ変数となっている。
だから親のメソッドを使っても派生型のままであり続け、自由にメソッドチェーンが出来る。

ただしここら辺はやや宗教的でもある。
親クラスの関数が派生クラスの変数を操作することを「仮想this」で実現するなら、
型安全ではなくなってしまう。
ただし実装は、単一継承の時には単に型チェックを外すだけと、極めて簡単であり、やる気だけの問題だ。
(ただしC++の場合には多重継承があるので若干問題がある)
なお、型安全を取りたいなら、仮想thisではなく、仮想メンバ変数で実現する事になる。
こちらはC++でも問題はない。(ただし動作速度が遅くなるが)
0070デフォルトの名無しさん (ワッチョイ 174f-9b2l)
垢版 |
2018/09/19(水) 19:13:17.80ID:GJOADTEF0
>>68
当初は delete &ptr[i]; と記述していたのだが、これは
1. ptr[i].~T(); (各エレメントのデストラクタのキック)
2. free(ptr[i]); (メモリ区画の解放)
の2つを実行するらしくて、駄目だった。
今の各エレメントはallocaで確保した区画に placement new しているので。

> 不思議なもん作ってんのなw
今回は事前に全部計算してalloca出来るが、
コンテナ長だけ親で確定、中身の長さは子でしか確定出来ないことも普通にあるだろ。

例えば、LGBT共のおかげでFacebookには56種類の性別があるらしいが、
これに対して、無作為に10,000人の性別を調査するとして、
コンテナ長は56で親で決まるが、
各性別人リスト長は子関数で調査しないと決まらないだろ。そこをheapに取ってる。
勿論、親も含めてheapに取り、ジャグvectorとするのがC++流であり、だからC比でいちいち遅くなる。
そこら辺を改善出来ないかのテストだ。
0072デフォルトの名無しさん (ブーイモ MMbf-nprU)
垢版 |
2018/09/19(水) 22:41:00.05ID:x2iiusAWM
>>70
何を悩んでんのかよくわからんが
普通にヒープから取ったんならdeleteだし
スタックをplacement newしたんなら自分でデストラクタ
それだけの話
というかね、はっきり言ってでかいデータをスタックに置く発想がセンスないぞ
0073デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/19(水) 22:56:01.63ID:xLP4ypV20
アホやな
スタック関係ない

アホは連続した一枚の板みたいなヒープに
ポインタの列ではなくオブジェクトインスタンスのメモリイメージの列をシリアルに並べてる

ホントな、アホしかいいないわ
0075デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/19(水) 23:10:27.91ID:xLP4ypV20
たとえば64byteのメモリが必要なクラスがあったとする
アホが作ったコンテナでは例えば要素が5個なら
こんな感じになるとアホはいってるワケ

 [0][64byte]
 [1][64byte]
 [2][64byte]
 [3][64byte]
 [4][64byte]

メモリの板に64*5のメモリイメージが配置される
要素が1つ増えるたびに64byte必要になることになる

ポインタなら(仮に32bitなら)こうなる

 [0][4byte] ← [64byte]
 [1][4byte] ← [64byte]
 [2][4byte] ← [64byte]
 [3][4byte] ← [64byte]
 [4][4byte] ← [64byte]

メモリの板に4*5のメモリイメージが配置される
さらに64byteのバラバラのメモリが5個できる
つまりメモリフラグメンテーションがおきることになる
0077デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/19(水) 23:17:16.10ID:xLP4ypV20
そもそもスタックとかいってるオマエも
相当頭悪いという自覚が必要
0079デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/19(水) 23:28:50.52ID:xLP4ypV20
さよか
0080デフォルトの名無しさん (ワッチョイ 174f-9b2l)
垢版 |
2018/09/19(水) 23:50:52.77ID:GJOADTEF0
>>71
お前が、というより最近の奴が何故
「俺の知ってる言語の『優位性』」に固執するのか甚だ疑問ではある。
ただ、お前は>>37も理解出来てないのだから、まずは「オブジェクト指向」を理解した方がいいぞ。

>>74
JavaScripterはそれ以前で、オブジェクト指向そのものを知らない奴が多いし、
他言語から来た奴は無理に「クラスベース」として捉えようとして誤解し、
しかもそれを垂れ流して間違いを再生産し、どうしようもない状況になってる。
JavaScripterには馬鹿しかいない。これは断言出来る。

>>76
俺はもう動けばいいだけなら普通に作れるんだよ。
その上で、C++の動作速度が遅く、記述がかったるいのを何とかしようと試してる。
先に言っておくが、俺はC比同速程度を目指している。
スマポ(キリッなC++なんてJavaよりちょっと速い程度しか出ないし、それなら俺はCLIを使うからそれでいい。
ただしC流の書き方は見た目分かりにくいから、
C比で遅くならない、或いは多少程度でもうちょっとましに書けないか試している。

今回のにしたって、最速はC流の「頭で全部分確保、ポインタで細切れにして渡す」に決まっている。
ただこれは見た目何をやっているのか分かりにくいし、関数に分割もしづらい。
クラスにしたって、仮想関数なしなら速度もメモリもオーバーヘッドはない。なら使わない手はない。
そういう、C比オーバーヘッド無し(或いは僅か)程度で、どこまで分かりやすい見た目になるかを試してる。

楽に書きたいだけなら、JavaScriptが現状最強だ。
C比5倍程度であの楽さ、他の言語なんてやってられない。
速ければいいだけならCだ。ただし記述が見た目分かりにくいのは否めない。
それでC++でどこまでCを改善出来るかを試している。メソッドチェーンもそれの一環だ。
0081デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/20(木) 00:06:31.99ID:zLqp8E230
だったらふつうにPODの配列でいいわけだからな
0082デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/20(木) 00:08:31.80ID:zLqp8E230
Cでわかりにくいコードを書くには
頭悪いという才能がいる
008471=67 (ワッチョイ 01b3-coYL)
垢版 |
2018/09/20(木) 00:27:41.21ID:CPfoYuVJ0
>>80
携帯とPCで書いたから同一人物とわからんかったかな
何か実現したいことがあって
>・derived等、継承で親のメソッドを使ったときにも「呼び出し側の型」を返す為のキーワードの整備
と書いてたんだと思って、解決策になるかもしれない情報を教えてあげようと思ったら
感謝もせんとC++に対するヘイトを垂れ流すだけだったから「ああ、あいつか・・・」となったんだが

>「俺の知ってる言語の『優位性』」に固執する
どこをどう読んだらそうなるのかわからん。というか鏡見ろ
0085デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/20(木) 00:31:01.70ID:zLqp8E230
遅いのはオマエのウンココードのアルゴリズムのせいだからな
気にする必要ないほどのオーバーヘッドが問題じゃない
0086デフォルトの名無しさん (ワッチョイ f94f-yqSl)
垢版 |
2018/09/20(木) 00:50:45.72ID:Yonx2vGH0
>>72
> スタックをplacement newしたんなら自分でデストラクタ
自分でデストラクタを書かなくて済むようにコンテナを用意してるんだよ。

というか、そもそもC++の思想はそうではないか?
ある意味、クラス外のコードでデストラクタを書いたら負けだろ。
そしてコンテナを用意するだけでこれを回避出来る。
それだけの話だ。

「書けばいい」の発想もいいが、俺はもうそれは十分出来るので、
書かなくて済む物を如何に増やすか、それを試してる。
結局、スクリプト言語が楽なのはここだし。


>>83
もう動作はしてるし、結果も比較して問題ないのを確認済み。
まあ、 alloca は相当使いづらいことも分かった。


>>84
いや、ワッチョイが同一だから同一人物だと認識してる。

> 解決策になるかもしれない情報を教えてあげようと思ったら
解決策になってないし、お前はそれが間違いだとも認識出来てない。
お前の情報は何の役にも立ってない。

馬鹿が間違ったことを言ってきて「間違ってるぞ」と言ったら「それでも感謝しろ」と言われた状況だ。
そういう考え方もありだが、俺はここではそれをしないし、する必要も無いし、するべきでもないと思ってる。
ここでは、間違ったことを言った奴は叩かれるべきだ。
そうでないと馬鹿がどんどん寄ってきて、結果、レベルが下がり、誰にとっても利益が無くなる。
間違ったことを言っても感謝されたいなら、少なくともIDやコテハンが付いてる場所へ行け。
そういうところが好きなら、そういう場所を盛り上げるべきであって、ここで文句を言うべきではない。
0089デフォルトの名無しさん (ワッチョイ 82d8-jhFb)
垢版 |
2018/09/20(木) 04:25:13.14ID:gyMuKR+I0
IntelのC++ Composerってサポート期限切れのシリアルでも使用可能なバージョンがあるのね
知らなかったよ

2017 update7
>This update can be installed even if your support service has expired using your existing Serial Number.
0090デフォルトの名無しさん (ワッチョイ 42a1-UYTc)
垢版 |
2018/09/20(木) 22:36:33.27ID:sE8+iEgQ0
はじめまして
ゼミの課題でc++でバカラのプログラムかいてこいって言われたんですけど
簡単ですか?
0092デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/20(木) 22:41:55.13ID:zLqp8E230
まずサイコロの運動をシミュレーションするところから
0094デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/20(木) 22:48:19.01ID:zLqp8E230
待ち行列で客が待つのもポアソン分布使ってシミュレーションする必要がある
0098デフォルトの名無しさん (ワッチョイ df7b-Z3mi)
垢版 |
2019/02/04(月) 15:45:55.20ID:01AVniBC0
「64bitのコードでコンパイルするよう指定」するやつだっけ?

「デカいメモリ」「エラーコード〜でブルースクリーン」ていう
キーワードで、記憶に引っかかる感じ。
0101デフォルトの名無しさん (ワッチョイ d97b-l1YC)
垢版 |
2019/02/13(水) 10:03:42.66ID:SbDYRWkR0
>>99
pdfは読んでいないが妥当だろう。生産性は上がる。

特殊化したければオレオレ名前空間でstdを継承し、それを使え、でいい。
stdを直接変更している糞コードなんてどこかの時点で切り捨てる必要がある。
それがそろそろだという判断だろうし、実際、妥当だと思う。
0107デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
垢版 |
2019/03/04(月) 10:10:34.95ID:kNFhD2SD0
エラー出るんだけどさ
mt19937 en;
int ep[en.state_size];
random_device rd;
generate(begin(ep), end(ep), rd); //C2280

このラムダみたいなことをやってくれる標準の何かない?
generate(begin(ep), end(ep), [&rd]{ return rd(); });
0109デフォルトの名無しさん (ワッチョイ d77d-3oSp)
垢版 |
2019/03/04(月) 11:42:55.83ID:oS3uKTCY0
generate(begin(ep), end(ep), en)
は?
0114デフォルトの名無しさん (ワッチョイ 7b7c-TO5r)
垢版 |
2019/05/07(火) 18:55:08.99ID:kySkQDUz0
そもそもP0551R3で禁止されるのは関数テンプレートの特殊化についてであって
std::hashなんかのクラステンプレートの特殊化は特に禁止されないのでは?
クラステンプレートの特殊化まで禁止されるとstd::tuple_sizeみたいなユーザによる特殊化ありきの機能が軒並み消滅する事になると思うんだが
0124デフォルトの名無しさん (ワッチョイ 0ff6-0ngu)
垢版 |
2019/07/23(火) 17:55:03.98ID:4sm3RNn+0
作れるものと作れないものは同じだ

文法的に「すごい」のというと、たとえばラムダ式とか構造化束縛、raw-string-literalあたり
型推定もCで頭固くなっちまった人にはそこそこカルチャーショックだよ
0129デフォルトの名無しさん (ワッチョイ 7f7c-CMz4)
垢版 |
2019/07/24(水) 10:35:13.16ID:N8NvLFq20
>>123
世界征服
0130デフォルトの名無しさん (ワッチョイ 0a61-5Ye2)
垢版 |
2019/07/25(木) 00:54:02.58ID:tRj/Vr/s0
>>123
・例えばAIライブラリは速度面からC++で組まれることが普通。
・言語コンパイラもコンパイル速度を重視すればC++が最適。
・AndroidOSそのものもC/C++で組まれる。
・Java Virtual Machineも、PC EmulatorもC/C++で組まれる。
・同程度の性能のデバイスでAndoidとiOSを比べたとき、前者が遅いといわれるのは
 全社はJava(仮想コードにコンパイルされる)、後者はSwing(native binaryにコンパイルされる)
 からが大きいと考えられる。
0131◆QZaw55cn4c (ワッチョイ aa47-UOPh)
垢版 |
2019/07/25(木) 19:08:12.49ID:1pUY2R+h0
>>130
では Java で記述されたコードをコンパイルした成果物が native binary であればいいのですね、これは商機があるかもしれませんね
0134デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/26(金) 07:12:48.67ID:4yTQHcMn0
>>131
実は、>>133が指摘してる通り JavaやC#は言語仕様そのものが native binary
に直してもC++ほどの速度にはなりにくい。例えば遅くなる理由として
1. GC(Garbage Collection)によって自動的にfreeやdeleteさせようとする仕様。
2. 標準的にはポインタを使わない仕様。
3. オブジェクトが構造体やスタックに埋め込まれずにheapからnewされ易い仕様。
4. 二次元以上の配列がJaggyタイプに成り易い仕様。
5. バッファオーバーランの防止のため、配列の境界チェックが行われやすい仕様。
6. ライブラリが巨大なため起動時に大量のコードがディスクから読み出されるため、
 起動が遅く成り易いこと。巨大になる理由の一つはリフレクションや型に
 #includeによる静的コンパイルをせずにすますためののクラスの型情報などが
 (Javaの場合は*.classや*.jarなどの)ライブラリに入っているためだろうか。

例えば、C#も予めnative binaryに直してしまう方法も有るが、それでも起動速度は
余り早くならないらしい。起動後も1.〜5.の理由のためC++程の速度にはなりにくい。
0135デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/26(金) 07:28:28.01ID:4yTQHcMn0
>>134
7. C#のリンクリストの場合、要素を削除する場合、文字列などの要素の中身か、
 要素番号を指定する必要が有る。要素Bを有る要素Aの後ろに追加する場合、
 Aの要素番号を指定する必要が有る。これが遅くなる。C/C++本来のリンクリストは
 削除や追加の場所の指定をポインタ(アドレス)で指定できることが速度上の大きな
 優位性であったのにそれが出来ない。なお、詳しくはないがC++のSTLのstd::listの場合は、
 同様の「不具合」があるためリンクリストの本来の性能が出ないかもしれない。
 しかし、それはSTLがC/C++の昔から使われていた本来のリンクリストの実装の仕方を
 していないからであると思われる。
0136デフォルトの名無しさん (ワッチョイ abe8-BZpS)
垢版 |
2019/07/26(金) 12:04:17.56ID:2lr5ek+30
Javaってランタイムがプリミティブなってるクラスを実行することがあったと思うけど、
ネーティブではそのプリミティブ型のクラスを分解してマシン語にしないといけなかった気がする。
0138デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/26(金) 16:10:27.37ID:KpYqHMjm0
decltype(ftime)::clock::to_time_t()
は、decltype(ftime) が std::filesystem::file_time_type なので、
意味的には長く書けば、
std::filesystem::file_time_type::clock::to_time_t()
となるとは思う。短くすれば、
file_time_type::clock::to_time_t()
となるけど、clock という名前空間は見つからなかったが、
std::chrono::system_clock::to_time_t()
という関数ならば存在しており、
static std::time_t to_time_t( const time_point& t ) noexcept;
という宣言にはなっているところまでは見つけた。
clock というキーワードが何なのかは不明。
0139デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/26(金) 16:16:35.83ID:KpYqHMjm0
last_write_time() の型は:
std::filesystem::file_time_type last_write_time(const std::filesystem::path& p);
file_time_type の型(?)は:
using file_time_type = std::chrono::time_point<>;
なので、
decltype(date)::clock::to_time_t() の部分は、decltype()部分を展開(?)すれば
std::chrono::time_point<>::clock::to_time_t()
と書けることは書ける。この部分は、存在することが分かっている:
std::chrono::system_clock::to_time_t()
ととてもよく似ている。
0140デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/26(金) 16:23:26.92ID:KpYqHMjm0
https://cpprefjp.github.io/reference/chrono/time_point.html
↑によれば、time_pointは
namespace std {
namespace chrono {
template <class Clock, class Duration = typename Clock::duration>
class time_point;
}}
というテンプレート・クラス。
file_time_typeは、C++20では、
using file_time_type = std::chrono::time_point<std::chrono::file_clock>;
と定義されているので、Clock=std::chrono::file_clock とされてテンプレートが具現化される
らしい。time_point<Clock,Duration>クラスには
Clock clock;
というメンバが存在するらしい。ゆえに、
decltype(date)::clock::to_time_t()は、
std::chrono::time_point<std::chrono::file_clock>::clock::to_time_t()
となり、clock=std::chrono::file_clock という意味になり、結局、
std::chrono::file_clock::to_time_t()
ということになるようだ。
0149デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/27(土) 08:21:00.74ID:zR8v2AWF0
>>148
https://code.woboq.org/llvm/libcxx/include/chrono.html
↑によれば、以下の様になっており、time_point は、一般的な
template の time_point<・・・>とsystem_clock::time_pointは
厳密には「別」で、後者は前者を特殊化したものを typedef宣言
している。そのため、 std::chrono::system_clock::to_time_t()の
(メンバ)関数宣言の
static time_t to_time_t(const time_point& t) noexcept;
のtime_pointは、chrono::time_point<system_clock>という
system_clock専用になっている。それが原因で>>147
エラーを出すらしい。

class system_clock {
public:
 ・・・
  typedef chrono::time_point<system_clock> time_point;
 ・・・
}
0151デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
垢版 |
2019/07/27(土) 09:20:37.82ID:zR8v2AWF0
>>150
time_point_cast() は根本的な「Clock」の部分は変換前後で共通の場合のみが
実装されているようです。なのでどこまでの細かい時間を表現できるかの
「時間精度」は変更できても、表現の違いのようなものまでは対応できないのかも
知れません:

namespace std {
namespace chrono {
template <class ToDuration, class Clock, class Duration>
time_point<Clock, ToDuration>
time_point_cast(const time_point<Clock, Duration>& t); // C++11

template <class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
time_point_cast(const time_point<Clock, Duration>& t); // C++14
}}
0152デフォルトの名無しさん (ササクッテロラ Sp85-UH6w)
垢版 |
2019/08/16(金) 13:02:16.52ID:ba3w2d//p
テンプレートとマクロのメリットデメリットって他にありますか?
またテンプレートとマクロの使い分けで悩んでいます

マクロのメリット
・一括置換ができる
・文字列も使用できる
・定数式にも使える(配列の要素数)

マクロのデメリット
・数式が複雑なときにミスをしやすい(++を渡してはいけない、演算優先順位がミスしやすい)
・型の識別ができない
・一行記述なので大規模なのには不向き

テンプレートのメリット
・名前空間を定義できるので影響範囲をとどめやすい
・型の識別ができる
・関数なので大規模なのも書ける

テンプレートのデメリット
・定数式にしようできない
・ユーザー定義と標準定義が混ざったときのエラーを判別しにくい

こんなメリットデメリットだと思っています。
他にありますか??

これを踏まえた上で使い分けとしては、
マクロは文字列などの簡単な定義に向いていて、テンプレートは処理(演算)を含むものと考えているのですが、
他に観点あるでしょうか
0153デフォルトの名無しさん (アウアウエー Sae3-SXVW)
垢版 |
2019/08/16(金) 13:05:39.63ID:mZqFzvyqa
宿題は宿題スレで
0155デフォルトの名無しさん (ワッチョイ 091a-vqjO)
垢版 |
2019/08/16(金) 13:12:45.69ID:4Npa+oRa0
>>152
「他にありますか?」の答えにはならないんだけど・・・

> テンプレートのデメリット
> ・定数式にしようできない

そんなことなくね?

> ・ユーザー定義と標準定義が混ざったときのエラーを判別しにくい

どういう状況のこと言ってるのかよくわからないけど、マクロにすればわかりやすくなる状況なのか
怪しい気がする。

ってことで、使い分けとしてはマクロでしかできないこと(トークン連結・文字列化)以外は
テンプレート使うとしたほうが簡単だと思うし、よく聞く話。
0157デフォルトの名無しさん (ワッチョイ 39f6-g2bq)
垢版 |
2019/08/16(金) 13:58:42.46ID:zb39QRfc0
展開じゃないからな
typename Tに何が来ているかなんてのはcout << typeid(T).name()で監視できるんで
iocccなみに解読困難なプリプロセッサ出力がないからって困りゃせん
0159デフォルトの名無しさん (ワッチョイ 590b-Y9+Q)
垢版 |
2019/08/29(木) 22:37:52.13ID:30u3pQod0
その監視というか確認の煩雑さは、マクロの方が面倒だろに。
0160デフォルトの名無しさん (ワッチョイ 590b-Y9+Q)
垢版 |
2019/08/29(木) 23:08:09.91ID:30u3pQod0
>>152
マクロは、テンプレートのメタ側に位置する機能なので、テンプレートに出来ない事や、テンプレート自体のコードに変更を入れる場合につかうと良い。
まあ、リテラルレベルの置換と、プリプロセッサの入力に使えるってくらいかな。

よく使うのは、コンパイルスイッチくらいじゃないかな。
極稀にリテラルを文字列化したり、リテラルレベルでトークン連結処理したりするくらいかな。

定数はぶっちゃけどっちでも良いけど、式を含むならconstexpr を使うのが c++11の流儀。
0161デフォルトの名無しさん (ワッチョイ 0101-MZ1U)
垢版 |
2019/08/29(木) 23:40:06.16ID:7sVXLGAA0
>>159
こんなクソみたいな記述入れて一旦ビルドして確かめるとか正気の沙汰じゃねーわ。
cout << typeid(T).name()
マクロもたいがいダメだろうがこれをやらせるって歪んでるとしか思えん。
0162デフォルトの名無しさん (ワッチョイ d101-GX87)
垢版 |
2019/08/30(金) 05:18:18.83ID:Ib8c6P200
一旦ビルドしてって、テンプレートはコンパイルしないと何が来るかなんて分からんだろ
>マクロもたいがいダメだろうが
とか雑な切り捨てしてる辺りからしても、めっちゃ初心者とみた
0164デフォルトの名無しさん (ワッチョイ 0101-MZ1U)
垢版 |
2019/08/30(金) 08:57:04.22ID:Okk0GWIA0
>一旦ビルドしてって、テンプレートはコンパイルしないと何が来るかなんて分からんだろ
だからこれがしょうもないってことを言ってるんだが。
静的にコード見て判断しずらい仕組みをなぜ疑問なく使えるのか、そっちのがよっぽど素人感丸出しだよ。
■ このスレッドは過去ログ倉庫に格納されています

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