C++メタプログラミングについて思ったこと
前回使用したプリプロセサの話をちゃんと解説した方がいいかなと思ったのですが、下記の参考文献がわかりやすく、そちらを参照して頂ければ十分かと思うので省かせてもらいます。
- Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング
- DigitalGhostさんのPreprocessor関連のエントリ
- An Introduction to Preprocessor Metaprogramming (「C++テンプレートメタプログラミング」についてくるので日本語でも読めます)
なので、今回はC++におけるメタプログラミングについて思うことをつらつらと書いてみます。駄文なので、スルーしてくださって結構です。
つい最近まで一般的に、C++のテンプレートメタプログラミング(TMP)はあまり使われるべきではない、と思われてきました。それも最近のコンパイラの対応状況改善及び、メタプログラミング, 関数型言語人気や関連書籍の登場によって緩和されてきたと思います。
ですが、明日仕事場ですぐに使える、といった活用事例が現時点ではまだまだ少ないのではないでしょうか。 RubyにおけるメタプログラミングはRailsという事例を得て、認知されました。 boostでは実際にTMPやプリプロセサメタプログラミングが高度にフル活用されているのですが、もっとアプリケーションコードに近いレベルで、例えばType Traitsがどんな場合に使える?といった事例紹介が欲しいなと思っていました。
具体的に僕が参考になったTMPの活用事例の一例を上げてみます。 GPS将棋の実装では、コンパイル時の条件分岐削減によるパフォーマンス向上にテンプレートが活用されています。 An Introduction to OSL
前回のエントリもそういう事例の一つになればいいなと思って書いてみました。 (TMPではなくプリプロセッサメタプログラミングの事例ですが……) 前回のコードは引数としてポインタ型が来た場合はどうするか?といった視点が抜けていましたが、ポインタが渡された時は特別な処理(コンパイルエラーにするとか)を追加してもいいと思います。そういった時にはis_pointerなどのType Traitsを利用して条件分岐してもいいですね。
今後も何かいい例が思いついたら書いてみようかと思っていますし、何かいい事例があったら教えてくれると嬉しいです。そろそろTMPも仕事で活用していきたいですね。