Explizite Spezialisierung von Klassenvorlagen

 

Klassenvorlagen können für bestimmte Typen oder Werte der Vorlagenargumente spezialisiert werden.Durch die Spezialisierung kann der Vorlagencode für einen bestimmten Argumenttyp bzw. einen Wert angepasst werden.Ohne Spezialisierung wird für jeden in einer Vorlageninstanziierung verwendeten Typ der gleiche Code generiert.Wenn in einer Spezialisierung die bestimmten Typen verwendet werden, wird die Definition für die Spezialisierung statt der ursprünglichen Vorlagendefinition verwendet.Eine Spezialisierung hat den gleichen Namen wie die Vorlage, von der sie eine Spezialisierung ist.Allerdings kann eine Vorlagenspezialisierung sich in vielerlei Hinsicht von der Originalvorlage unterschieden.Beispielsweise kann sie unterschiedliche Datenmember und Memberfunktionen haben.

Verwenden Sie die Spezialisierung, um eine Vorlage für einen bestimmten Typ oder Wert anzupassen.Verwenden Sie die teilweise Spezialisierung, wenn die Vorlage über mehr als ein Vorlagenargument verfügt und Sie nur eines von ihnen spezialisieren müssen, oder wenn Sie das Verhalten für einen ganzen Satz von Typen spezialisieren möchten, z. B. alle Zeigertypen, Verweistypen oder Arraytypen.Weitere Informationen finden Sie unter Partielle Spezialisierung von Klassenvorlagen.

// 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
}
157
Char value: s

Siehe auch

Klassenvorlageninstanziierung
Partielle Spezialisierung von Klassenvorlagen (C++)