What is it, naokirin?

ちょっとテンプレートメタプログラミング (1)

私は最近C++ばかりやってますね。(コードを書いているわけではありませんが)

C++の中でもC++0xやBoostについてが最近は多いのですが、その中でもテンプレートを用いたメタプログラミングは現在初心者として頑張っているところです。


メタプログラミングとはそもそも何かを調べてみるとWikipedia

メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

と書いてあります。これではさっぱりという人もいるとは思います。(ちなみに私は何のことやらさっぱり)

さらにテンプレートメタプログラミングというものも調べてみます。

テンプレートメタプログラミング(英: Template metaprogramming)は、メタプログラミング技法の一種であり、コンパイラがテンプレートを使って一時的ソースコードを生成し、それを他のソースコードと結合してコンパイルする方式である。テンプレートが出力するものは、コンパイル時の定数、データ構造、関数定義などがある。テンプレートの利用は言わばコンパイル時の実行である。この技法は様々な言語で使われている

まだ少々具体性が出てきたので、理解できそうな気もしてきました。

ちなみにテンプレートメタプログラミングの恩恵はC++を使っている人なら一度はあるとは思います。

ジェネリックプログラミングの実装にはよくテンプレートメタプログラミングが用いられています。
ジェネリックプログラミングはデータ形式に依存せずに、また重複したコードを書かずに済むようにするプログラミングのテクニックです。

STLvectorなどは典型例です(というよりはSTL全般ですが)。vectorはTの部分に様々な型やクラスを指定することで様々に変化します。
これはテンプレートメタプログラミングを用いて書かれており、データ形式に依存せずに、また重複したコードを書かずに済んでいるわけです。

もちろん、メタプログラミングは複雑になりやすく、他人の理解しにくいコードとなりやすい部分もあります。(解説が無ければ、少なくとも初心者の私にはメタプログラミングで書かれたコードは読めません。)

ただ使ったことのある人はわかると思いますが、STLを見る限りその力は強力です。
そのため(他の言語でも言えることですが)メタプログラミングは重要視されています。


・・・と、ここまでいろいろ並べてきましたが、要はそんなこんなで私がテンプレート使いになりたいと言っているだけです。
少しずつステップアップしていき、しっかりとこの記事の続きを書ければいいなと思っています。