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


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

 

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

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

// 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
Символьное значение: s

См. также

Создание экземпляра шаблона классов
Частичная специализация шаблонов класса (C++)