Specializzazione esplicita di un template di classe
I modelli della classe possono essere specializzati per tipi specifici o ai valori degli argomenti.La specializzazione consente al codice del modello sia personalizzata per un tipo di argomento o un valore specifico.Senza specializzazione, lo stesso codice viene generato per ogni tipo utilizzato in una creazione di istanze del modello.In una specializzazione, quando i tipi specifici vengono utilizzati, la definizione per la specializzazione viene utilizzata al posto della definizione di modello originale.Una specializzazione con lo stesso nome del modello che è una specializzazione.Tuttavia, una specializzazione del template può essere diverso in molti modi dal modello originale.Ad esempio, può disporre delle funzioni membro e i membri dati diversi.
utilizzare la specializzazione per personalizzare un modello per un tipo specifico o un valore.Utilizzare la specializzazione parziale quando il modello dispone di più di un argomento di modello ed è necessario solo specializzare una di esse, o quando si desidera specializzare il comportamento di un intero insieme di tipi, analogamente a tutti i tipi di puntatore, tipi di riferimento, o tipi di matrice.Per ulteriori informazioni, vedere Specializzazione parziale dei modelli di classe.
Esempio
// 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();
}