Explizite Spezialisierung von Klassenvorlagen
Klassenvorlagen können für bestimmte Typen oder Werte der Vorlagenargumente spezialisiert werden.Spezialisierung kann für einen bestimmten Argumenttyp bzw. einen Wert angepasst werden soll, Vorlagencode.Ohne Spezialisierung wird der gleiche Code für jeden generierten Typ, der in einer Vorlage instanziierung verwendet wird.In einer Spezialisierung wenn die bestimmten Arten verwendet werden, wird die Definition für die Spezialisierung statt der ursprünglichen Vorlagendefinition verwendet.Eine Spezialisierung hat den gleichen Namen wie die Vorlage, aus der es sich um eine Spezialisierung ist.Allerdings kann eine Master spezialisierung in der ursprünglichen Vorlage in vielerlei Hinsicht verschieden sein.Beispielsweise kann es sich um unterschiedliche Datenmember und Memberfunktionen haben.
Verwenden Sie spezialisierung, um eine Vorlage für einen bestimmten Typ oder einen Wert anzupassen.Verwenden Sie partielle Spezialisierung, wenn die Vorlage über mehr als ein Vorlagenargument und Sie nur einer von ihnen spezialisiert werden müssen, oder wenn Sie Verhalten für einen ganzen Satz von Typen, z. B. alle Zeigertypen, und Arraytypen Verweistypen spezialisiert werden soll.Weitere Informationen finden Sie unter Partielle Spezialisierung von Klassenvorlagen.
Beispiel
// 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();
}