Явная специализация шаблона класса
Шаблоны класса можно специализировать для определенных типов и значений аргументов шаблона.Специализация позволяет коду шаблона для настройки для конкретного типа или значения аргумента.Без специализации, один и тот же код создается для каждого типа, используемого в экземпляр шаблона.В специализации, когда конкретные типы используются определение для специализации используется вместо исходного определения шаблона.Специализация имеет то же имя, что и шаблон которого специализация.Однако специализация шаблона может быть отличающася несколькими способами из исходного шаблона.Например, оно может иметь другие элементы данных и функции-члены.
Используйте специализацию для настройки шаблон для конкретного типа или значения.Используйте частично специализацию, если шаблон содержит несколько аргументу и специализировать шаблон только один из них или нужно специализировать расширение функциональности для всего набора типов, например все типы указателей, ссылочные типы или типы массива.Дополнительные сведения см. в разделе Частично специализация шаблона класса.
Пример
// 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();
}