X



C++/TemplateMetaProgramming
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2008/02/16(土) 12:45:02
・ここはC++のテンプレートメタプログラミング専用スレです。
・なかったので立てました。
・前にもあったような気がするけど気にしない。
・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。

仲良く使ってね。
0506デフォルトの名無しさん
垢版 |
2014/10/17(金) 00:45:58.06ID:Hi4Jootu
constexprだと最適化で再帰が平文化されて深度気にしなくていいって聞いたことあるんだけど本当?
0507デフォルトの名無しさん
垢版 |
2014/10/17(金) 02:10:59.46ID:cTCCghlL
んなわきゃない
再帰->ループの最適化が可能ならconstexprとは関係なくされるし
ループに変換できないならコンパイル時計算であっても再帰で処理されるから限界はある
0508デフォルトの名無しさん
垢版 |
2014/10/18(土) 09:29:03.19ID:tA+rY70l
実行時に再帰の深さでスタックオーバーフローになることがない、という質問ならその通り。
0510デフォルトの名無しさん
垢版 |
2015/03/02(月) 23:56:25.01ID:1xZgmfYC
C#のようにダイナミックなメタプログラミングも面白いと思うんだがC++じゃ難しいかな
メタ属性の自動生成的なTMPテクニックは無いものか
0512デフォルトの名無しさん
垢版 |
2015/03/16(月) 00:43:32.44ID:oGjevCAQ
メタプログラミングってのを勉強しはじめたんですが、

template<int value1, int value2>
struct Add
{
enum { result = value1 + value2 };
};
std::cout << Add<2, 3>::result << std::endl;

で、5と出力されますが、
int i = 2;
std::cout << Add<i, 3>::result << std::endl;

だとコンパイルできません。
コンパイル時に定数しか受け付けないんだとしたらなんの意味があるの?

std::cout << 5 << std::endl;
って書いているのと同じですよね
0513デフォルトの名無しさん
垢版 |
2015/03/18(水) 22:31:40.63ID:LJL5ftmA
メタプログラミングなんてコンパイル時に決定していなければならないのでほとんどの場合使い物になりません。
2つの数字を足してますが、コンパイル時に2数は2と3で無ければいけません。
ユーザに入力してもらう場合は使えないので、実用性はありませんよ
0515デフォルトの名無しさん
垢版 |
2015/03/18(水) 23:26:06.70ID:9CBewuhX
テンプレートメタプログラミングは、コンパイル時に「型」を計算させるもの
0518デフォルトの名無しさん
垢版 |
2015/03/21(土) 22:45:18.22ID:7+ji4sYH
マクロとテンプレート関数について教えてください
大きいほうを返却するマクロとテンプレート
#define OOKIINOHADOCCHIDAM(A,B) (A>=B?A:B)
template<typename T> T OOKIINOHADOCCHIDAT(T A,T B){return A>=B?A:B;}

int ookiihou;
ookiihou = OOKIINOHADOCCHIDAM(1,2);
ookiihou = OOKIINOHADOCCHIDAT(1,2);

とした場合
絶対にinlineで展開されるという保障が無いため、OOKIINOHADOCCHIDATは呼び出し分不利だと
思うのですがどうなんでしょうか?
0519デフォルトの名無しさん
垢版 |
2015/03/22(日) 16:00:44.78ID:573iYXRM
パフォーマンスを気にするなら出力されたアセンブラを見て検討する。
最適化がどの程度かというのは処理系やバージョンによって違うから、TMPのスレで話すような話題ではない。
パフォーマンスとは別に、マクロと違って
OOKIINOHADOCCHIDAT(i++,--j)
とか
OOKIINOHADOCCHIDAT( 0 || 1, 2 )
とかやっても見えない副作用が無い。

ところでここはメタプログラミングのスレなんで、次からは初心者質問のスレで質問してね。誘導されてから個別のスレでね。
0520デフォルトの名無しさん
垢版 |
2015/03/22(日) 23:21:32.87ID:ljCp5GrR
テンプレートなんてハッカーが作ったもの以外は使えないだろ
だいたい、どんな型でも良いようなことなんて実際のプログラムでひつようなことなんてほとんどない
設計時に決めてしまっているため、コンピュータサイエンスを研究している学者かハッカーくらいしか
自作することは無い
0525デフォルトの名無しさん
垢版 |
2015/03/23(月) 23:43:51.12ID:1fiK6OPe
モジュール化は問題なくできるだろ。
モジュールとかパッケージに対する観念がカチカチの柔軟性のない頑固頭だからそういう話になる。

また、テンプレート一般の話なら C++ スレでやりたまえ。
背伸びしないで、メタプログラミングに興味が出てからまたきたまえ。
0527デフォルトの名無しさん
垢版 |
2015/03/24(火) 00:39:45.62ID:SJvrs7Lk
めたpろはやり尽くした結果余計でレガシーな洗練されてないダサい技術と確信した
0529デフォルトの名無しさん
垢版 |
2015/03/24(火) 08:08:40.57ID:PUWZ5d3i
>>504
じゃあ関数型言語が当たり前にやってきたことを今更取り入れてるんですか? 遅れってる〜
0530デフォルトの名無しさん
垢版 |
2015/03/24(火) 20:28:20.19ID:mo5/BctE
メタプログラミングってコンパイル時に定数でなきゃいけないんですよね?
よく例として階乗が出されるが
int n = factorial(3);
でしか使えないんですよね

それだったらコンパイル時に計算なんてせずに
int n = 6;
と書いてけば、コンパイル時間も短縮できるからなんの意味があるのかさっぱりわからん
0531デフォルトの名無しさん
垢版 |
2015/03/25(水) 00:14:10.62ID:sC+pepL9
>>530
その「3」を、コンパイル時に自由に設定可能にしたい時、毎回結果を人間が計算するとかありえないだろ…
0532デフォルトの名無しさん
垢版 |
2015/03/25(水) 00:31:47.02ID:1YXCDFuZ
プログラムから計算結果をコードにして吐き出す方が速くて柔軟で理解しやすいよ
TMPはゴミ
0533デフォルトの名無しさん
垢版 |
2015/03/25(水) 00:50:49.93ID:KfwtEOZY
>>531
その「3」を、毎回人間がコンパイル時に変更するとかはありえるんですか?
3を編集しているなら、結果もそのまま編集してしまってもいいのでは?
0534デフォルトの名無しさん
垢版 |
2015/03/25(水) 01:43:20.22ID:sC+pepL9
>>533
うーん、毎回計算したいなら、すればとしか言いようがない。
人間が計算するのはバグの元なのは周知の事実だと思うが、そこは理解してもらえない?
それから、コンパイル時に変更する値というのはかなりあるよ。
開発したことないのかな?
0535デフォルトの名無しさん
垢版 |
2015/03/25(水) 02:30:41.03ID:OtL+LsbQ
>>530
コメントには 3! とか factorial(3) とか書くんだろ?
ならコードにそのまま書いてあるのが意図をスムーズに伝える読みやすいコードと言えるだろう。
そこでテンプレートを使うべきかどうかは別の問題だが、君の例はコンパイル時計算に拘る必要がないことを示す例としては不適切だ。
0536デフォルトの名無しさん
垢版 |
2015/03/26(木) 11:11:30.93ID:GXztcScs
>>534
コンパイル時に変更するなら結果もいっしょに変更してしまえといってるだけ

人間が計算するのはバグの元なのは周知の事実であれば
int n = 1 + 2;

もNGですか?

int n = 3;
じゃだめですか?
0537デフォルトの名無しさん
垢版 |
2015/03/27(金) 00:48:21.76ID:a/NfPwWW
>>536
めんどくさいなあ。
やりたきゃ自分で計算しても構わないよ。
一般論を言ってるだけで、別に強要してないんだから、好きにすればいいんじゃないかな。
0538デフォルトの名無しさん
垢版 |
2015/03/28(土) 09:00:56.00ID:SDORTR7x
コイツみたいなのがバラまいたマジックナンバーだらけのコードは引き継ぎたくねぇな…。
0539デフォルトの名無しさん
垢版 |
2015/03/28(土) 09:05:21.23ID:INa8PmT6
保守するやつなんかどうでも良いし
過酷な条件で下請けを虐める連中もどうでも良い
仕様を満たす中で最も保守性の悪いコードを書くよ
0542デフォルトの名無しさん
垢版 |
2015/03/28(土) 21:00:18.20ID:Ruzh6H/h
int n = 6; // 3の階乗
とどう違うの?

こちらのほうがコンパイル時間が短い分だけよくね?
結果が分かっているものをコンパイル時に計算するって無駄ですよね
0544デフォルトの名無しさん
垢版 |
2015/03/28(土) 23:14:01.94ID:Yd74aMwf
>>540
マジックナンバーだよ。できれば意味の分かりやすい名前付きの値にしたほうがいい。

>>542
"3" を変更しようとしたらその "6" とコメント中の "3" との両方を変えないといけなくなる。
少なくともその例ならコンパイル時間の差を人が認識できることはないレベルだろうから、
保守性を落とす(&変更に無駄な手間を必要とする)理由にはならない。
0545デフォルトの名無しさん
垢版 |
2015/03/28(土) 23:35:09.90ID:Ruzh6H/h
コンパイル時に決定してるいることなんてほとんど無いでしょ?
たとえばテキストエディタで決まったファイルネームで且、中身の決まったものしか
読めないテキストエディタなんてだれが使うの?

開くファイルはコンパイル時には決定できませんよね
0546デフォルトの名無しさん
垢版 |
2015/03/28(土) 23:50:02.28ID:m4j2ohKe
>>545
TMPでアプリケーション書こうとするから話がおかしくなるんだよ

enable_ifみたいに型を引数に取って、型を返すメタ関数があると、ライブラリ書くときにすげぇ便利なんだ
型はコンパイル時に決定されるものだからね
0547デフォルトの名無しさん
垢版 |
2015/03/29(日) 00:06:01.07ID:GiWz43mQ
型計算しなきゃならない時点で設計ミスだからね
TMPに甘えないで設計力を身につけなさい
メタプログラミングは言語依存度高いから慣れきってしまうと他の言語を使う時に困るよ
0549デフォルトの名無しさん
垢版 |
2015/03/29(日) 00:50:26.32ID:YISrMA6X
不特定多数が利用するテンプレートライブラリの場合だと、
ライブラリの利用者ごとに違う型で使われる可能性があるから、
ライブラリ視点で見ると型がころころ変わるね
0550デフォルトの名無しさん
垢版 |
2015/03/29(日) 01:09:19.30ID:XfQU9N1R
設計力(笑)
そんなやつがわざわざC++使っておいて無駄だらけの非効率的なコードを書くんだろうな
0551デフォルトの名無しさん
垢版 |
2015/03/29(日) 01:49:10.02ID:M18I0Bq+
templateってstlやboostを作ってるようなハッカー達が書いたものなら安心して使えるが、
正直その辺の連中が書いたようなものなんて全く信用できなくね?

っていうか、会社では禁止されてる。
stlやboostは使用OK
0553デフォルトの名無しさん
垢版 |
2015/03/29(日) 09:42:26.60ID:foFOOypx
>>542
その通り、よく気づいたね!
君はスーパープログラマへの階段を登りつつある!
その調子でガンバレ!
0554デフォルトの名無しさん
垢版 |
2015/03/29(日) 10:10:31.27ID:SE+Q5kVo
>>551
テンプレートは予測困難すぎて誰が書いたって信用出来ないよ
STLやBOOSTが信用される理由は利用者が多くて必然的によくテストされてるってだけ
0555デフォルトの名無しさん
垢版 |
2015/03/29(日) 17:12:30.32ID:M18I0Bq+
利用者が多くてテストされてるから信用されるわけではない
信用されてるから利用者が多い
0558デフォルトの名無しさん
垢版 |
2015/03/30(月) 21:05:29.90ID:Z/xNzUYF
コンパイル時に決定してることってあるの?
そういったプログラムだとATMなら決まった暗証番号で決まった金額しか入出金できないの?
0560デフォルトの名無しさん
垢版 |
2015/04/03(金) 21:09:27.68ID:6jSxnujl
TMPは要するにmake前に./configureしてるようなもんだろ
TMPでソースコードを自動生成して、直後にコンパイルするんだよ
感覚掴めた?
0561デフォルトの名無しさん
垢版 |
2015/04/03(金) 21:31:20.03ID:Jz/BH8fu
メタプログラミングのメリットが感じられん
コンパイル時に決定していることなんてごく僅かじゃん
0563デフォルトの名無しさん
垢版 |
2015/04/03(金) 23:16:46.72ID:1fmbbdAS
コンパイル時しか使えないのはまだ許せるが実装手段が汚いのがなぁ
拡張して美しいメタプログラミングができるようにすればいいのに
0564デフォルトの名無しさん
垢版 |
2015/04/08(水) 23:35:19.71ID:rJ1QxPv7
03コンパイラでdecltypeと同等の機能を実装する事は出来ないのかい?
関数合成とかしたいけど返り値の型計算が出来ない…
0566デフォルトの名無しさん
垢版 |
2015/05/17(日) 21:20:10.02ID:hki7XweT
上級者がすなるTMPといふものを、俺もしてみむとてするなり
先ずはテンプレートテクニックとかいうのを買えばいいんだろう?
0567デフォルトの名無しさん
垢版 |
2015/05/17(日) 23:07:33.84ID:z/t+/yPf
>>566
気になった本から読めばいいと思うが
『Modern C++ design』や
翔泳社の
『C++テンプレートメタプログラミング』
『C++テンプレート完全ガイド』
もあるでよ
0568デフォルトの名無しさん
垢版 |
2015/05/18(月) 00:38:25.36ID:owFvwpuo
TMPは完全なお遊びだよ
まともな現場じゃ禁止されてるのが当たり前なぐらい保守とテストが難しい
そして設計がまともならそもそもTMPに出番はない
勉強する価値はないよ
0569デフォルトの名無しさん
垢版 |
2015/06/01(月) 20:13:46.23ID:EdWu5WFj
そりゃそうだろ
どんな型でもいい状況が、あるわけがない
コーディングする前に、データ構造はすべて決定してるからな
0572デフォルトの名無しさん
垢版 |
2015/06/05(金) 14:46:38.01ID:PPi1ASxW
そして設計がまともならそもそもTMPに出番はない

的を射てるな

どんな方でも入れるような大衆店なんて嫌だな
0577デフォルトの名無しさん
垢版 |
2015/11/07(土) 19:21:52.86ID:t6CLGU5E
>>570
比較的低いレイヤーのコード触る以外に必要ない。
そしてそういうものはお前の100倍頭のいい方々がすでに実装されているものがある。
0580デフォルトの名無しさん
垢版 |
2016/03/29(火) 09:07:55.24ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
0581デフォルトの名無しさん
垢版 |
2016/04/24(日) 03:46:29.95ID:PmTKsIVl
どんな型でも扱えることが必要になることなんてありますか?
設計が終わった時には、すべて型なんて決まってるからな
0582デフォルトの名無しさん
垢版 |
2016/04/24(日) 10:35:05.32ID:IhUvQdoq
ライブラリにはだいたい必要だよ。
ライブラリの利用者がどんな型を必要とするかなんて、ライブラリの作者は知らないから。
0583デフォルトの名無しさん
垢版 |
2016/04/24(日) 14:06:44.93ID:Inhm7+j0
>>581
型以外全く同じコードを沢山書きたいなら俺らは止めたりしないよ。
0585デフォルトの名無しさん
垢版 |
2016/04/25(月) 01:41:28.12ID:ZFUQDfs5
STLやboostなら使えるが、素人が書いたtemplateなんて使いものにならないな
禁止されてる理由がわかる
0586デフォルトの名無しさん
垢版 |
2016/04/25(月) 09:42:02.50ID:7tPDaHNy
ヒープじゃなくスタックに値を持つベクトルとかで
次元数をテンプレートにしたりしてるけどな
これテンプレート引数で渡さないと壁にぶつかると思う
0591デフォルトの名無しさん
垢版 |
2016/06/23(木) 09:40:20.91ID:7EyqyniW
頭の体操的な目的には割と良いと思う
TMPをそれなりに嗜んでおけば他の言語が楽に感じる
0592デフォルトの名無しさん
垢版 |
2016/07/14(木) 00:08:17.53ID:NnRKTyQ9
定数式中の&&がショートサーキットしてくれなくて
ムンクの叫びになりかけたんだが、よく考えたら当たり前だよな……
0593デフォルトの名無しさん
垢版 |
2016/07/30(土) 18:04:44.54ID:qgpylzNJ
TMPなんて必要になったことがない、コンパイル時に決定してることなんてあるか?
階乗の計算でTMPでコンパイラに計算させなくても、ハードコーディングでいいじゃん
0594デフォルトの名無しさん
垢版 |
2016/07/30(土) 18:32:50.81ID:WLIyTwaV
>>593
なんでわざわざハードコーディングなんてするん?
TMPでいいじゃん。
0597デフォルトの名無しさん
垢版 |
2016/07/30(土) 19:27:27.17ID:WLIyTwaV
>>596
いや、3とタイプする方が速いが?
0599デフォルトの名無しさん
垢版 |
2016/07/30(土) 19:48:50.85ID:WLIyTwaV
>>598
コード生成コストはイニシャルコストと考えれば、0とみなせますが?
0602デフォルトの名無しさん
垢版 |
2016/07/30(土) 20:03:27.36ID:qgpylzNJ
数値計算なんて使い物にならんだろう
入力はコンパイル時に決定してる必要があるんだからw
■ このスレッドは過去ログ倉庫に格納されています

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