Compartir a través de


Especialización explícita de las plantillas de clase

 

Las plantillas de clase se pueden especializar para tipos o valores específicos de los argumentos de plantilla.La especialización permite que el código de plantilla se personalice para un tipo o valor de argumento específico.Sin la especialización, se genera el mismo código para cada tipo utilizado en una creación de instancias de plantilla.En una especialización, cuando se utilizan los tipos específicos, se usa la definición de la especialización en lugar de la definición de plantilla original.Una especialización tiene el mismo nombre que la plantilla de la que procede la especialización.Sin embargo, una especialización de plantilla puede diferir de muchas maneras de la plantilla original.Por ejemplo, puede tener miembros de datos y funciones miembro diferentes.

Utilice la especialización para personalizar una plantilla para un tipo o valor específico.Utilice la especialización parcial cuando la plantilla tenga más de un argumento de plantilla y solo necesite especializar uno de ellos, 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 Especialización parcial de plantillas de clase.

// 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
Valor del carácter: s

Vea también

Crear instancias de plantillas de clase
Especialización parcial de plantillas de clase (C++)