Compartir a través de


Specialization explícita de las plantillas de clase

Las plantillas de clase pueden especializar por tipos específicos o valores de los argumentos.Especialización permite que el código de plantilla sea personalizado por un tipo o un valor específico del argumento.Sin la especialización, el mismo código se genera para cada tipo utilizado en una instancia de una plantilla.En una especialización, cuando se utilizan los tipos específicos, la definición de especialización se utiliza en lugar de la definición de plantilla original.Una especialización tiene el mismo nombre que la plantilla es una especialización.Sin embargo, una especialización de plantilla puede ser diferente en gran medida de la plantilla original.Por ejemplo, puede tener distintos miembros de datos y las funciones miembro.

Utilice la especialización para personalizar una plantilla para un tipo concreto o un valor.Utilice la especialización parcial cuando la plantilla tiene más de un argumento y se de plantilla solamente necesitan especializar una de ellas, o cuando desee especializar el comportamiento de un conjunto completo de tipos, como todos los tipos de puntero, tipos de referencia, o tipos de matriz.Para obtener más información, vea Specialization parcial de plantillas de clase.

Ejemplo

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

Vea también

Referencia

Instancia de una plantilla de clase

Specialization parcial de plantillas de clase (C++)