明示的特殊化

C++テンプレート引き数の特定のセットでテンプレートをインスタンス化する場合、 コンパイラーは、それらのテンプレート引き数に基づいて新規の定義を生成します。 この定義生成の振る舞いをオーバーライドできます。 その代わりに、コンパイラーがテンプレート引き数の任意のセットで使用する定義を、 指定することができます。 これは、明示的特殊化 と呼ばれます。 次のものを明示的に特殊化できます。

構文 - 明示的特殊化宣言
 
>>-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() を使用します。

関連参照

IBM Copyright 2003