テンプレートの部分特殊化
部分特殊化は、複数の型にまたがって影響を及ぼすようになった明示的特殊化であると言える。
このコードは例えば、次のように用いる。
ここで、次のような部分特殊化を導入する。
get_iteratorの後ろの<T[N]>という記述で、コンパイラはこれが部分特殊化だと認識する。これによって、次のように配列に対してもget_iteratorが使用可能になる。
int[MAX]だけでなく、const char[80]やstd::complex[4]などT[N]の形に一致する型であればいずれも部分特殊化版のget_iteratorが使用される。このように、どの一次テンプレート・明示的特殊化・部分特殊化を使用するかはパターンマッチ的に決定される。
テンプレートの部分特殊化が可能なのはクラステンプレートのみである。関数テンプレートは部分特殊化できず、明示的特殊化のみ可能である。しかし多くの場合、関数テンプレートの部分特殊化は多重定義によって代用できる。
テンプレートはメタクラスである。つまりコンパイラに対してどのようなクラスを作るかを指示したある種の抽象データ型であると言える。たとえばテンプレートであるvector(動的配列)をプログラマが使うときには、vector<int>、vector<string>などのようにデータ型を指定して実体化する。実体化されたvectorは、コンパイラの生成したオブジェクトコードの中ではそれぞれ別のコードが生成され、それぞれ別のクラスとして扱われる。
もしテンプレートクラスは特定のデータ型を指定して使われることが多いと知っており、そのデータ型の場合にだけ人の手で最適化をかけられる(たとえば整数型のときは2の乗数での乗除算をシフト演算にするなど)としたら、通常の場合のテンプレートとは別に、明示的特殊化を行うことができる。テンプレートを使用する際に指定されたデータ型が、明示的特殊化されているものだった場合、コンパイラは明示的特殊化されたものをコンパイルしてコードを生成する。
たとえば、これは要素数nの配列の先頭要素を指すポインタpに対して、全ての要素をxにするということを行うC++の関数テンプレートarray_fillである。
これは、特殊化ではない通常のテンプレートの定義である。このような明示的特殊化でないものを一次テンプレートと言う (X3014 14.5.4)。
もしその配列がchar型だった場合、標準Cライブラリのmemsetを使うことができ、その方がstd::fill_nより高速化されているとする。そのような場合、次のように明示的特殊化すれば、array_fillにchar型の先頭要素を指すポインタが渡されたときにはmemsetを用いるようにすることができる。