H
Hallo,
Partial Template Specialization ist die Möglichkeit alternative Definitionen einer (generischen) Template-Klasse (auch genannt primary oder base template genannt)für eine Familie von Template-Argumenten anzugeben.
Oder auch: Eine partielle Spezialisierung ist eine Verfeinerung eines Basistemplates für eine eingeschränkte Menge von Parametern. In ihrer Semantik ist eine partielle Spezialisierung ähnlich der Funktionsüberladung. Der selbe Klassenname, aber andere Implementationen.
Im Gegensatz dazu steht explicit Template Specialization, dass die Möglichkeit bietet ein primary Template für einen festen Satz Typen anzugeben. Hier müssen alle Templateparameter substituiert werden.
// primary template
template <class T, class U>
struct Foo {};
// explizite Spezialisierung für T = int und U = double
template <>
struct Foo<int, double> {};
// partielle Spezialisierung a) für T = Pointertyp und U = double
template <class T>
struct Foo<T*, double> {};
// partielle Spezialisierung b) für T = Array von int und beliebige U
template <class T, int n, class U>
struct Foo<T[n], U>
{};
int main()
{
Foo<int, double> f; // explizite Spezialisierung
Foo<int*, int> f2; // primary Template
Foo<int*, double> f3; // partielle Spezialisierung a)
Foo<int[5], char> f4; // partielle Spezialisierung b)
}
Die Zahl der Argumente muss für eine Spezialisierung immer gleich der des Basistemplates sein. Die Zahl der Templateparameter hingegen kann abweichen.