类模板的显式专用化

类模板可专用于特定类型或模板参数的值。 专用化允许为特定参数类型或值自定义模板代码。 如果没有进行专用化,则会为模板实例化中使用的每个类型生成相同的代码。 在专用化中,当使用特定类型时,将使用专用化的定义而不是原始模板定义。 专用化的名称与专用化模板的名称相同。 但是,模板专用化在许多方面与原始模板不同。 例如,它可具有不同的数据成员和成员函数。

使用专用化可自定义特定类型或值的模板。 在以下情况下使用部分专用化:当模板拥有多个模板参数且你只需要专用化其中一个模板参数时,或当你需要专用化整组类型(如所有指针类型、引用类型或数组类型)的行为时。 有关详细信息,请参阅类模板的部分专用化

示例

// 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
}
  

请参见

参考

类模板实例化

类模板的部分专用化 (C++)