Kursinhalt
C++-Vorlagen
C++-Vorlagen
Partielle Vorlagenspezialisierung
Die Spezialisierung von Templates für ein einzelnes Parameter-Template ist unkompliziert, wird jedoch bei mehreren Parametern komplexer. Hier kommt die partielle Templatespezialisierung ins Spiel. Sie ermöglicht es Ihnen, eine spezialisierte Version eines Templates für spezifische Teilmengen von Typen oder Werten zu erstellen.
main
// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }
Syntax der partiellen Templatespezialisierung
Sie können die partielle Templatespezialisierung als eine Form der Template-Überladung betrachten. Hier sind die zu befolgenden Regeln:
Bei der partiellen Spezialisierung definieren Sie eine neue Version einer Template-Funktion, bei der einige ihrer Parameter auf bestimmte Typen festgelegt sind, während andere generisch bleiben. Der Compiler verwendet diese spezialisierte Version, wann immer er während der Template-Instanziierung auf passende Typen trifft.
main
#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }
Das ist eine Möglichkeit, die Templatespezialisierung zu verwenden, aber es gibt ein anderes, häufigeres Szenario.
main
#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
Danke für Ihr Feedback!