クラス テンプレートの明示的な特殊化
クラスはテンプレート引数を特定の型または値のために特化することができます。特化するにはテンプレート コードが特定の引数の型または値用にカスタマイズできるようにします。特化せずに同じコードはテンプレートのインスタンス化に使用する型ごとに生成されます。特殊化では特定の型を使用すると特化したクラスの定義は定義元のテンプレートの代わりに使用されます。特化にはの特化型を持つテンプレートと同じ名前になります。ただしテンプレートから特化したテンプレートには多くの点で異なります。たとえば別のデータ メンバーおよびメンバー関数を持たせることができます。
特定の型または値のテンプレートをカスタマイズするために特化を使用します。1 以上のテンプレート引数とそれらの 1 を特化する必要がある場合は全体のすべての型参照ポインター型または配列型などの型の動作は特化する場合はテンプレートにある部分的な特化を使用します。詳細についてはクラス テンプレートの部分的特殊化 を参照してください。
使用例
// explicit_specialization1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
// Template class declaration and definition
template <class T> class Formatter
{
T* m_t;
public:
Formatter(T* t) : m_t(t) { }
void print()
{
cout << *m_t << endl;
}
};
// Specialization of template class for type char*
template<> class Formatter<char*>
{
char** m_t;
public:
Formatter(char** t) : m_t(t) { }
void print()
{
cout << "Char value: " << **m_t << endl;
}
};
int main()
{
int i = 157;
// Use the generic template with int as the argument.
Formatter<int>* formatter1 = new Formatter<int>(&i);
char str[10] = "string1";
char* str1 = str;
// Use the specialized template.
Formatter<char*>* formatter2 = new Formatter<char*>(&str1);
formatter1->print();
formatter2->print();
}