C++/TemplateMetaProgramming
■ このスレッドは過去ログ倉庫に格納されています
・ここはC++のテンプレートメタプログラミング専用スレです。
・なかったので立てました。
・前にもあったような気がするけど気にしない。
・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。
仲良く使ってね。 テンプレートメタプログラミングはプログラマブルマクロですか? constexprを使うとだいぶ楽になる
再帰は免れないけど constexprだと最適化で再帰が平文化されて深度気にしなくていいって聞いたことあるんだけど本当? んなわきゃない
再帰->ループの最適化が可能ならconstexprとは関係なくされるし
ループに変換できないならコンパイル時計算であっても再帰で処理されるから限界はある 実行時に再帰の深さでスタックオーバーフローになることがない、という質問ならその通り。 C#のようにダイナミックなメタプログラミングも面白いと思うんだがC++じゃ難しいかな
メタ属性の自動生成的なTMPテクニックは無いものか メタプログラミングってのを勉強しはじめたんですが、
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;
って書いているのと同じですよね メタプログラミングなんてコンパイル時に決定していなければならないのでほとんどの場合使い物になりません。
2つの数字を足してますが、コンパイル時に2数は2と3で無ければいけません。
ユーザに入力してもらう場合は使えないので、実用性はありませんよ テンプレートメタプログラミングは、コンパイル時に「型」を計算させるもの マクロとテンプレート関数について教えてください
大きいほうを返却するマクロとテンプレート
#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は呼び出し分不利だと
思うのですがどうなんでしょうか? パフォーマンスを気にするなら出力されたアセンブラを見て検討する。
最適化がどの程度かというのは処理系やバージョンによって違うから、TMPのスレで話すような話題ではない。
パフォーマンスとは別に、マクロと違って
OOKIINOHADOCCHIDAT(i++,--j)
とか
OOKIINOHADOCCHIDAT( 0 || 1, 2 )
とかやっても見えない副作用が無い。
ところでここはメタプログラミングのスレなんで、次からは初心者質問のスレで質問してね。誘導されてから個別のスレでね。 テンプレートなんてハッカーが作ったもの以外は使えないだろ
だいたい、どんな型でも良いようなことなんて実際のプログラムでひつようなことなんてほとんどない
設計時に決めてしまっているため、コンピュータサイエンスを研究している学者かハッカーくらいしか
自作することは無い >>520
世の中には静的ポリモーフィズムと言う考え方もあるんだお。 モジュール化は問題なくできるだろ。
モジュールとかパッケージに対する観念がカチカチの柔軟性のない頑固頭だからそういう話になる。
また、テンプレート一般の話なら C++ スレでやりたまえ。
背伸びしないで、メタプログラミングに興味が出てからまたきたまえ。 めたpろはやり尽くした結果余計でレガシーな洗練されてないダサい技術と確信した >>504
じゃあ関数型言語が当たり前にやってきたことを今更取り入れてるんですか? 遅れってる〜 メタプログラミングってコンパイル時に定数でなきゃいけないんですよね?
よく例として階乗が出されるが
int n = factorial(3);
でしか使えないんですよね
それだったらコンパイル時に計算なんてせずに
int n = 6;
と書いてけば、コンパイル時間も短縮できるからなんの意味があるのかさっぱりわからん >>530
その「3」を、コンパイル時に自由に設定可能にしたい時、毎回結果を人間が計算するとかありえないだろ… プログラムから計算結果をコードにして吐き出す方が速くて柔軟で理解しやすいよ
TMPはゴミ >>531
その「3」を、毎回人間がコンパイル時に変更するとかはありえるんですか?
3を編集しているなら、結果もそのまま編集してしまってもいいのでは? >>533
うーん、毎回計算したいなら、すればとしか言いようがない。
人間が計算するのはバグの元なのは周知の事実だと思うが、そこは理解してもらえない?
それから、コンパイル時に変更する値というのはかなりあるよ。
開発したことないのかな? >>530
コメントには 3! とか factorial(3) とか書くんだろ?
ならコードにそのまま書いてあるのが意図をスムーズに伝える読みやすいコードと言えるだろう。
そこでテンプレートを使うべきかどうかは別の問題だが、君の例はコンパイル時計算に拘る必要がないことを示す例としては不適切だ。 >>534
コンパイル時に変更するなら結果もいっしょに変更してしまえといってるだけ
人間が計算するのはバグの元なのは周知の事実であれば
int n = 1 + 2;
もNGですか?
int n = 3;
じゃだめですか? >>536
めんどくさいなあ。
やりたきゃ自分で計算しても構わないよ。
一般論を言ってるだけで、別に強要してないんだから、好きにすればいいんじゃないかな。 コイツみたいなのがバラまいたマジックナンバーだらけのコードは引き継ぎたくねぇな…。 保守するやつなんかどうでも良いし
過酷な条件で下請けを虐める連中もどうでも良い
仕様を満たす中で最も保守性の悪いコードを書くよ >>538
int n = factorial(3);
の3はマジックナンバーなのでは? >>540
それはマジックナンバーとは言わないかな。
意味がわかるから。 int n = 6; // 3の階乗
とどう違うの?
こちらのほうがコンパイル時間が短い分だけよくね?
結果が分かっているものをコンパイル時に計算するって無駄ですよね meta factorial なんか例に挙げるから明後日の方向に話が進むんだよ >>540
マジックナンバーだよ。できれば意味の分かりやすい名前付きの値にしたほうがいい。
>>542
"3" を変更しようとしたらその "6" とコメント中の "3" との両方を変えないといけなくなる。
少なくともその例ならコンパイル時間の差を人が認識できることはないレベルだろうから、
保守性を落とす(&変更に無駄な手間を必要とする)理由にはならない。 コンパイル時に決定してるいることなんてほとんど無いでしょ?
たとえばテキストエディタで決まったファイルネームで且、中身の決まったものしか
読めないテキストエディタなんてだれが使うの?
開くファイルはコンパイル時には決定できませんよね >>545
TMPでアプリケーション書こうとするから話がおかしくなるんだよ
enable_ifみたいに型を引数に取って、型を返すメタ関数があると、ライブラリ書くときにすげぇ便利なんだ
型はコンパイル時に決定されるものだからね 型計算しなきゃならない時点で設計ミスだからね
TMPに甘えないで設計力を身につけなさい
メタプログラミングは言語依存度高いから慣れきってしまうと他の言語を使う時に困るよ 不特定多数が利用するテンプレートライブラリの場合だと、
ライブラリの利用者ごとに違う型で使われる可能性があるから、
ライブラリ視点で見ると型がころころ変わるね 設計力(笑)
そんなやつがわざわざC++使っておいて無駄だらけの非効率的なコードを書くんだろうな templateってstlやboostを作ってるようなハッカー達が書いたものなら安心して使えるが、
正直その辺の連中が書いたようなものなんて全く信用できなくね?
っていうか、会社では禁止されてる。
stlやboostは使用OK Makefile使えばplain Cでできるじゃんよ >>542
その通り、よく気づいたね!
君はスーパープログラマへの階段を登りつつある!
その調子でガンバレ! >>551
テンプレートは予測困難すぎて誰が書いたって信用出来ないよ
STLやBOOSTが信用される理由は利用者が多くて必然的によくテストされてるってだけ 利用者が多くてテストされてるから信用されるわけではない
信用されてるから利用者が多い コンパイル時に決定してることってあるの?
そういったプログラムだとATMなら決まった暗証番号で決まった金額しか入出金できないの? TMPは要するにmake前に./configureしてるようなもんだろ
TMPでソースコードを自動生成して、直後にコンパイルするんだよ
感覚掴めた? メタプログラミングのメリットが感じられん
コンパイル時に決定していることなんてごく僅かじゃん >>561
その通り!
君はすごいなあ。
良くそこに気付いた! コンパイル時しか使えないのはまだ許せるが実装手段が汚いのがなぁ
拡張して美しいメタプログラミングができるようにすればいいのに 03コンパイラでdecltypeと同等の機能を実装する事は出来ないのかい?
関数合成とかしたいけど返り値の型計算が出来ない… 上級者がすなるTMPといふものを、俺もしてみむとてするなり
先ずはテンプレートテクニックとかいうのを買えばいいんだろう? >>566
気になった本から読めばいいと思うが
『Modern C++ design』や
翔泳社の
『C++テンプレートメタプログラミング』
『C++テンプレート完全ガイド』
もあるでよ TMPは完全なお遊びだよ
まともな現場じゃ禁止されてるのが当たり前なぐらい保守とテストが難しい
そして設計がまともならそもそもTMPに出番はない
勉強する価値はないよ そりゃそうだろ
どんな型でもいい状況が、あるわけがない
コーディングする前に、データ構造はすべて決定してるからな ……。
型以外全く同じコードが現れるのがそんなに珍しいか? そして設計がまともならそもそもTMPに出番はない
的を射てるな
どんな方でも入れるような大衆店なんて嫌だな (スレが落ちることを気にして無理にレスする必要は)ないです >>570
比較的低いレイヤーのコード触る以外に必要ない。
そしてそういうものはお前の100倍頭のいい方々がすでに実装されているものがある。 サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート どんな型でも扱えることが必要になることなんてありますか?
設計が終わった時には、すべて型なんて決まってるからな ライブラリにはだいたい必要だよ。
ライブラリの利用者がどんな型を必要とするかなんて、ライブラリの作者は知らないから。 >>581
型以外全く同じコードを沢山書きたいなら俺らは止めたりしないよ。 STLやboostなら使えるが、素人が書いたtemplateなんて使いものにならないな
禁止されてる理由がわかる ヒープじゃなくスタックに値を持つベクトルとかで
次元数をテンプレートにしたりしてるけどな
これテンプレート引数で渡さないと壁にぶつかると思う そんなナイーブな理解の人に一々返事してあげるなんて賢者かって… このスレの進み具合から、TMPの意味がやっと分かったよ Totemo Muzukashi Programing 頭の体操的な目的には割と良いと思う
TMPをそれなりに嗜んでおけば他の言語が楽に感じる 定数式中の&&がショートサーキットしてくれなくて
ムンクの叫びになりかけたんだが、よく考えたら当たり前だよな…… TMPなんて必要になったことがない、コンパイル時に決定してることなんてあるか?
階乗の計算でTMPでコンパイラに計算させなくても、ハードコーディングでいいじゃん >>593
なんでわざわざハードコーディングなんてするん?
TMPでいいじゃん。 >>594
3の階乗なら6とタイプするほうが早いだろ >>598
コード生成コストはイニシャルコストと考えれば、0とみなせますが? TMP嫌ってる奴は関数型言語にアレルギーおこしてそう TMP否定派の人って数値計算にしか使えないと思ってるの 数値計算なんて使い物にならんだろう
入力はコンパイル時に決定してる必要があるんだからw ちょっとミスったら訳わからんエラーの洪水が出るのは改善されたのかのぅ ■ このスレッドは過去ログ倉庫に格納されています