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


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

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

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

Пример

// 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();
}
  

См. также

Ссылки

Экземпляр шаблона класса

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