前述の例では、テンプレートは完全に特殊化されています。つまり、このようなテンプレートは特定のテンプレート引数に対する実装を定義しています。テンプレートは部分的に特殊化することも可能です。これは、テンプレートパラメータの一部だけを指定する、または、1 つまたは複数のパラメータを特定のカテゴリの型に制限することを意味します。部分特殊化の結果、それ自身はまだテンプレートのままです。たとえば、次のコード例に、本来のテンプレートとそのテンプレートの完全特殊化を示します。
template<class T, class U> class A {...}; //primary template template<> class A<int, double> {...}; //specialization |
次のコード例に、本来のテンプレートの部分特殊化を示します。
template<class U> class A<int> {...}; // Example 1 template<class T, class U> class A<T*> {...}; // Example 2 template<class T> class A<T**, char> {...}; // Example 3 |
例 1 は、最初のテンプレートパラメータが int 型である特殊なテンプレート定義です。
例 2 は、最初のテンプレートパラメータが任意のポインタ型である、特殊なテンプレート定義です。
例 3 は、最初のテンプレートパラメータが任意の型のポインタへのポインタであり、2 番目のテンプレートパラメータが char 型である、特殊なテンプレート定義です。