ところで全然話飛ぶけれど, Template Metaprogramming ってそれ単体で純粋に有用っつー場面はほとんどないっちぅか,コンパイル時計算ですよ, Turing Complete ですよ,だからナニ?例えば, 5! をコンパイル時に計算したいなら電卓で手計算でもして "hoge = 120; // 5!" とかコメントに注釈でも書いておきなさいよ,とか半ば本気で思っている人で……っていうか, TMP 単体は基本的に非常に実装コストが高く,効率も非常に悪く(ここで言ってる「効率」とはつまりコンパイルにかかる時間とコンパイル時に消費されるメモリに関する効率),文法に関しても洗練のせの字もないという言語なので, TMP でフィボナッチとかたらいまわしとかカックロ電卓とか C++ コンパイラで計算しましたとかってマジで趣味としての楽しみと自己満足と TMP に馴染む時間以外のなんらの実益も生み出さないもので,そこだけ見て例えば「TMP は自己満足でしかない」とか言われたりしてもそりゃそーだよにゃーとうなずくしかにゃいわけで,しかしそれでも,実装コストが高く,効率も非常に悪く,文法も洗練されていない TMP がそれだけの欠点を抱えてもなお使用されその真価を発揮するのは,それが C++ の型システムに直接アクセスできる言語であり, C++ コード内部に C++ コードでありながら別次元の言語体系 (DSEL) を提供できるためだからで,特に "a federation of several different languages" である C++ の,いわば "an intra-language glue language" としての TMP の真価を体感しにゃい限り正当な評価は難しいだろうにゃーと思う今日この頃. Boost.MPL にゃんて完全に "a library for libraries" ですよ,あれ. TMP の example として Boost.MPL 使ってフィボナッチとかたらいまわしとかカックロ電卓とか見せるのは,そりゃ確かに取っ掛かりのインパクトは強烈だけれど,それで放置してしまうと TMP の紹介としては完全な「ミスリード」で終わってしまう気がする.まぁ,かといって TMP の「ミスリードでない」実用は基本的に Boost などの(汎用テンプレート)ライブラリ実装の中にしか存在しないので,理解のためのハードルが一気に跳ね上がってしまうのだけれど.
どーすりゃー TMP についての「良い」紹介ができるのかにゃー.Boost.Spirit や Boost.Statechart なんかの DSEL 見せて「こういうことができるのは TMP のおかげです」っていう方策だと間接的なインパクトは高めだけれど直接的な説得力はかなり薄そーだしにゃー.かといって,単体で「boost::add_const を使うと型に const 修飾子を付与できます」だとそれこそ「ハァ!?だからナニ?」だしにゃー.いや, boost::add_const とか必須中の必須なんだけれど,必須となる実例が(汎用テンプレート)ライブラリの中にしか存在しないから,文脈なしで TMP の恩恵に説得力を持たせるの不可能にゃんだよにゃー.何か良い introduction ないかにゃー.「どうやれば TMP が書けるか」の introduction はそこらじゅうにあるけれど,「TMP が書けると何がうれしいか」の具体的な introduction が完全に欠落してるんだよにゃー.
とかぶつくさ書いていても結局,具体例全然出してないから机上の空論か……. meta-code とかのレベルが手元で動かせるようになったら TMP の別の可能性が見えてくるのかも知れにゃいけど,現物がない今の段階では実際の実用があんまし思いつかにゃいしにゃー.