テンプレート引き数の特定のセットでテンプレートをインスタンス化する場合、
コンパイラーは、それらのテンプレート引き数に基づいて新規の定義を生成します。
この定義生成の振る舞いをオーバーライドできます。
その代わりに、コンパイラーがテンプレート引き数の任意のセットで使用する定義を、
指定することができます。
これは、明示的特殊化 と呼ばれます。
次のものを明示的に特殊化できます。
構文 - 明示的特殊化宣言 >>-template--<-->--declaration_name--+------------------------------+--declaration_body->< '-<--template_argument_list-->-'
template<> 接頭部は、次のテンプレート宣言が、テンプレート・パラメーターを取得しないということを示しています。 declaration_name は、以前に宣言されたテンプレートの名前です。少なくとも特殊化が参照されているまでは、明示 的特殊化を前もって宣言できること、その場合 declaration_body は、オプションであることに注意してください。
次の例は、明示的特殊化を示しています。
using namespace std; template<class T = float, int i = 5> class A { public: A(); int value; }; template<> class A<> { public: A(); }; template<> class A<double, 10> { public: A(); }; template<class T, int i> A<T, i>::A() : value(i) { cout << "Primary template, " << "non-type argument is " << value << endl; } A<>::A() { cout << "Explicit specialization " << "default arguments" << endl; } A<double, 10>::A() { cout << "Explicit specialization " << "<double, 10>" << endl; } int main() { A<int,6> x; A<> y; A<double, 10> z; }
次に、上記の例の出力を示します。
Primary template non-type argument is: 6 Explicit specialization default arguments Explicit specialization <double, 10>
この例では、主テンプレート (特殊化しようとしているテンプレート) クラス A に対して、2 つの明示的特殊化を宣言しました。 オブジェクト x は、主テンプレートのコンストラクターを使用します。 オブジェクト y は、明示的特殊化 A<>::A() を使用します。 オブジェクト z は、明示的特殊化 A<double, 10>::A() を使用します。
関連参照