テンプレート (プログラミング)
C++11規格までのテンプレートには、大別して関数テンプレートとクラステンプレートがある。C++14では変数テンプレートもサポートするようになった。
関数テンプレートは任意の型の引数を受け取ることができる関数のようなものである。たとえば、標準C++ライブラリにある関数テンプレートmax(x, y)は引数xとyのうち、大きな方を返す関数テンプレートで、次のように定義できる。
そして次のように呼び出せる。
ここで、テンプレート内にてTで表されているものをテンプレート仮引数 (template parameter) という。Tはパラメータ化された型 (parameterized type) とも呼ばれる。テンプレート仮引数はtypenameキーワードもしくはclassキーワードを用いて修飾する必要がある。テンプレート自身は実体をもたないため、利用する際は実体化 (instantiate) する必要がある。実体化の方法のひとつとして、max<int>のように具体的な型すなわちテンプレート実引数 (template argument) を明示的に指定することができるが、曖昧さがない場合に限り、コンパイラは関数テンプレートの実引数として与えられた値の型(この例の場合では、xおよびyとして渡された整数型リテラルの型であるint)からTに対応する型を推論し、得られた具体的な型intをTに当てはめて関数を暗黙的に実体化することもできる。
C++のテンプレートはまた、実行時ではなくコンパイル時にコードの一部を事前評価する方法であるテンプレートメタプログラミングにも利用できる。C++のテンプレートはチューリング完全である。ただし、コンパイラによる制限がある。規格上は再帰の深さは参考 (informative) で処理系限界 (implementation limits / implementation quantities) であり、C++の作業原案 (working draft) のひとつ N3797 では1024を最小として例示している。再帰の制限が無ければコンパイル処理が永遠に終了しないコードを記述することができ、それをコードから判断することはコンパイラには不可能だからである。停止性問題を参照。