Specializzazione esplicita di modelli di classe
I modelli di classe possono essere specializzati per i tipi o i valori specifici degli argomenti di modello. La specializzazione consente la personalizzazione del codice del modello per un tipo di argomento o valore specifico. Senza specializzazione, lo stesso codice viene generato per ogni tipo utilizzato nella creazione di un'istanza di un modello. In una specializzazione, quando vengono utilizzati i tipi specifici, anziché la definizione di modello originale viene utilizzata la definizione della specializzazione. Una specializzazione ha lo stesso nome del modello di cui costituisce una specializzazione. Tuttavia, una specializzazione di modello può essere per molti aspetti diversa dal modello originale. Può ad esempio disporre di funzioni membro e membri dati diversi.
Usare la specializzazione per personalizzare un modello per un tipo o un valore specifico. Usare la specializzazione parziale quando il modello dispone di più di un argomento di modello ed è sufficiente specializzare uno di essi oppure quando si desidera specializzare il comportamento di un intero set di tipi, ad esempio tutti i tipi di puntatore, i tipi di riferimento o i tipi di matrice. Per altre 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(&i);
char str[10] = "string1";
char* str1 = str;
// Use the specialized template.
Formatter<char*> formatter2(&str1);
formatter1.print(); // 157
formatter2.print(); // Char value : s
}