テンプレート (プログラミング)
テンプレートに関するコンパイルエラーメッセージを改善するために、C++0xではコンセプトと呼ばれる機能の導入が検討されていたが、結局C++11では見送られた。コンセプトはC++17規格でも実装されていない。
クラステンプレートはテンプレートの概念をクラスに当てはめたものである。汎用的なコンテナ (generic containers) の作成によく用いられる。たとえばSTLにはリンクリストとしてstd::listが存在する。整数のリストを作りたければstd::list<int>と書き、文字列のリストを作りたければstd::list<std::string>と書けばよい。std::listの要素型に対する要件は規格バージョンによって異なるが、例えばC++03まではCopyAssignableおよびCopyConstructibleを必要とする。これらの要件を満たす限り、たとえどんな型がstd::listの要素型として指定されても動作する共通の関数集合が定義されている。なお、関数テンプレートと違い、クラステンプレートではテンプレート引数を型推論することができなかったが、C++17にてサポートされるようになった。
テンプレート引数の数はC++03までは固定であり、定義時にひとつひとつ明示的に指定する必要があったが、C++11では可変引数テンプレート (variadic template) がサポートされるようになった。可変長引数の関数やマクロのように、...という記法を用いて記述する。
このようにして実体化された関数を特殊化(あるいは特殊化版、特殊バージョン)という。例のmax<int>(3, 7), max(3, 7)に対してはintの特殊化が、max<double>(-3.1, -8), max(-3.1, -8.0)に対してはdoubleの特殊化が呼ばれることになる。なお、実体化のことを具現化と呼ぶこともある。
maxのインスタンス化に際して、xとyがどんな型でもx < yという式が生成される。またユーザー定義型の場合も、<演算子が適切に多重定義されていればその型に対してmaxが使える。Tとして利用可能な型の集合に何らかの共通の継承関係がある必要はない。つまり、テンプレートは静的なダック・タイピング (duck typing) を可能とする。同様の例は他にもあり、STLには適切な演算子が定義されていれば任意の型が利用可能になるという関数テンプレートが数多く存在する。例えば<演算子が定義されていれば、sort(), stable_sort(), binary_search()や、配列からヒープ構造を作成するアルゴリズム、setなどのコンテナなどが利用可能になる。関数テンプレートには述語 (predicate) として関数オブジェクトを受け取るものも存在し、ソートの比較などに使われるコールバック関数をカスタマイズすることが容易になっている。つまり、要件を満たすためのいくつかの演算子を定義するだけで、新しいデータ型に対して幅広い機能を得られる。