テンプレートメタプログラミング
上記の階乗の例はコンパイル時の最適化の一例であり、プログラム内で必要とされる階乗の値を予め計算して、定数としてコード内に組み込んでコンパイルを行う。これは実行時の性能とメモリ使用量の両面で効果がある。しかし、これはそれほど大きな最適化ではない。
もっと重要なコンパイル時の最適化として、テンプレートメタプログラミングを使ったコンパイル時のループ展開がある。ここでは n 次元のベクトルクラスの作成を例として示す(n はコンパイル時に分かっている)。n 次元ベクトルではループ展開によって性能が大きく改善される。ここでは加算演算子を例として示す。
コンパイラがこのテンプレート関数をインスタンス化すると、次のようなコードが生成される:
コンパイラは、テンプレートのパラメータ dimension がコンパイル時に定数なので、for ループをコンパイル時に展開できる。この手法の具体的実装例がBoost C++ Library等にある。
テンプレートメタプログラミングの文法はそのプログラミング言語本来のそれとだいぶ異なることが多いが、それでもテンプレートを使うのには理由がある。理由のひとつとしてジェネリックプログラミングの実装をするためということが挙げられる(似たようなコードをいくつも書かないようにする)。また、コンパイル時のコードの最適化の利点を最大限生かすためという理由もある。通常では最適化されない部分もテンプレートを使っていると最適化される場合がある。