Compartilhar via


Especialização explícita de modelos de classe

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

Use a especialização para personalizar um modelo para um tipo ou valor específico. Use a especialização parcial quando o modelo tiver mais de um argumento e você só precisar especializar um deles, ou quando você quiser especializar o comportamento de um conjunto inteiro de tipos, como todos os tipos de ponteiro, de referência ou 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(&i);

    char str[10] = "string1";
    char* str1 = str;
    // Use the specialized template.
    Formatter<char*> formatter2(&str1);

    formatter1.print(); // 157
    formatter2.print(); // Char value : s
}
  

Consulte também

Referência

Instanciação do modelo de classe

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