次の方法で共有


クラス テンプレートの明示的特殊化

 

クラス テンプレートは、テンプレート引数の特定の型または値に特殊化することができます。特殊化を使用すると、特定の引数型または値に対してテンプレート コードをカスタマイズできます。特化しない場合は、テンプレートのインスタンス化に使用される型ごとに、同じコードが生成されます。特殊化では、特定の型を使用すると、特殊化の定義が元のテンプレート定義の代わりに使用されます。特殊化は、特殊化されるテンプレートと同じ名前になります。ただし、テンプレートの特殊化は、元のテンプレートと多くの点で異なります。たとえば、異なるデータ メンバーおよびメンバー関数を持つことができます。

特定の型または値のテンプレートをカスタマイズするには、特化を使用します。テンプレートに 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(&i);

    char str[10] = "string1";
    char* str1 = str;
    // Use the specialized template.
    Formatter<char*> formatter2(&str1);

    formatter1.print(); // 157
    formatter2.print(); // Char value : s
}
157
Char 値: s

参照

クラス テンプレートのインスタンス化
クラス テンプレートの部分的特殊化 (C++)