テンプレートメタプログラミング
「コンパイル時のプログラミング」とはどういう意味かを示すため、階乗関数の例を示す。以下はテンプレートを使わない場合のC++のコードである:
このコードは 4 と 0 の階乗を求めている。
テンプレートメタプログラミングとテンプレートの特殊化を再帰のために使って階乗の計算を実装すると、実行時に階乗の計算をせずにコンパイル時に計算を行うことができる:
このコードは 4 と 0 の階乗をコンパイル時に計算し、その結果を定数のように扱う。
これら2種類のバージョンはどちらもプログラムの機能という意味では同じであるが、前者は階乗をプログラム実行時に計算しているのに対して、後者はそれをコンパイル時に計算する。しかし、このようにテンプレートを使うには、テンプレートのパラメータの値がコンパイル時に判っていなければならず、Factorial<X>::value は X がコンパイル時に決まっている場合にしか使えない。換言すれば、X はコンパイル時定数(リテラルや sizeof など)の呼び出し結果でなければならない。
メタプログラミング手法としてのテンプレート利用には2段階の操作が必要である。まずテンプレートを定義し、次にそれをインスタンス化しなければならない。テンプレートは生成すべきコードの一般化された形式を示し、インスタンス化によってそのテンプレートから具体的なソースコードが生成される。
テンプレートメタプログラミングは一般にチューリング完全であり、コンピュータプログラムで実行できることはテンプレートメタプログラムでも実行できる。
テンプレートはマクロとは異なる。マクロもコンパイル時に使われる機能で、文字列操作によってソースコードを生成する。一般的にソースコード中の字を置き換える形式のマクロ機能は、言語の意味とか型といったものを考慮できない(LISPのマクロはこの限りではない)。
テンプレートメタプログラムには変更可能な変数がない。つまり、変数は初期化時に一回代入を行うだけである。これは一種の関数型プログラミングと言える。実際、テンプレートの実装では制御構造や再帰呼び出しだけを実装していることが多い。