Partilhar via


Especialização explícita de modelos de classe

Modelos de classe podem ser especializados para tipos específicos ou valores dos argumentos de modelo.A especialização permite que o modelo de código para ser personalizado para um tipo de argumento específico ou o valor.Sem especialização, o mesmo código é gerado para cada tipo usado em uma instanciação de modelo.Uma especialização, quando os tipos específicos são usados, a definição para a especialização é usada em vez de definição do modelo original.Uma especialização tem o mesmo nome que o modelo do qual ele é uma especialização.No entanto, uma especialização de modelo pode ser diferente de várias maneiras do modelo original.Por exemplo, ele pode ter funções de membro e membros de dados diferentes.

Use a especialização para personalizar um modelo para um tipo específico ou um valor.Use especialização parcial quando o modelo tem mais de um argumento de modelo e você só precisará specialize um deles, ou quando desejar specialize comportamento para todo um conjunto de tipos, como, por exemplo, todos os tipos de ponteiro, tipos de referência ou tipos de matriz.Para obter mais informações, consulte Especialização parcial de modelos de classe.

Exemplo

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

Consulte também

Referência

Instanciação de modelo de classe

Especialização parcial de modelos de classe (C++)