Spécialisation explicite des modèles de classe
Les modèles de classe peuvent être spécialisés pour des types ou des valeurs spécifiques des arguments template. La spécialisation permet au code du modèle d'être personnalisé pour un type d'argument ou une valeur spécifique. Sans spécialisation, le même code est généré pour chaque type utilisé dans une instanciation du modèle. Dans une spécialisation, lorsque les types spécifiques sont utilisés, la définition de la spécialisation est utilisée au lieu de la définition du modèle d'origine. Une spécialisation porte le même nom que le modèle dont elle est une spécialisation. Toutefois, une spécialisation de modèle peut différer de nombreuses façons du modèle d'origine. Par exemple, elle peut avoir des données membres et les fonctions membres différentes.
Utilisez la spécialisation pour personnaliser un modèle pour un type ou une valeur spécifique. Utilisez la spécialisation partielle lorsque le modèle comporte plusieurs arguments template et que vous devez uniquement en spécialiser un, ou lorsque vous souhaitez spécialiser le comportement d'un ensemble de types, par exemple tous les types pointeur, tous les types référence ou tous les types tableau. Pour obtenir des informations supplémentaires, reportez-vous à la rubrique Spécialisation partielle des modèles de classe.
Exemple
// 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
}