Поделиться через


Явная специализация шаблонов класса

Шаблоны класса можно настроить для определенных типов или значений аргументов шаблона. Специализация позволяет выполнять настройку кода шаблона для конкретного типа аргумента или значения. Без специализации один и тот же код создается для всех типов, используемых в создании экземпляра шаблона. В специализации, когда используются определенные типы, вместо исходного определения шаблона используется определение для специализации. Специализация имеет то же имя, что и шаблон, который она специализирует. Однако специализация шаблона может по многим параметрам отличаться от исходного шаблона. Например, она может иметь разные члены данных и функции-члены.

Используйте специализацию для настройки шаблона для конкретного типа или значения. Используйте частичную специализацию, если шаблон содержит несколько аргументов, а требуется специализировать только один из них, либо если нужно специализировать поведение для всего набора типов, например всех типов указателей, ссылочных типов или типов массивов. Дополнительные сведения см. в разделе Частичная специализация шаблонов классов.

Пример

// 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++)