Vorlagen (Templates) sind ein Mechanismus in C++, der es ermöglicht, generische Klassen und Funktionen zu erstellen, die mit verschiedenen Datentypen funktionieren, ohne den Code zu duplizieren. Dies ist die Grundlage für die Implementierung von STL-Containern, Algorithmen und vielen Mustern der allgemeinen Programmierung.
Arten von Vorlagen:
Beispiel für eine Klassenvorlage:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
Beispiel für eine Funktionsvorlage:
template<class T> T add(const T& a, const T& b) { return a + b; }
Kann man ausdrücklich nur eine Methode einer Vorlagenklasse spezialisieren, ohne die gesamte Klasse zu spezialisieren? Wenn ja, wie geht das?
Antwort:
Ja, das ist möglich. Es ist nicht erforderlich, die gesamte Klasse zu spezifizieren; man kann einfach eine einzelne Methode spezialisieren:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // Spezialisierung nur der Methode bar für int // Implementierung }
Geschichte
In einem Projekt wurde eine Funktionsvorlage zum Vergleichen geschrieben:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }Bei der Verwendung mit Typen, die keinen
<-Operator haben, trat ein Kompilierungsfehler auf, den man lange suchte, da die Diagnose nur bei der Instanzierung der Vorlage ausgegeben wurde, nicht an der Stelle ihrer Definition.
Geschichte
Ein Entwickler versuchte, in einer Vorlagenfunktion die Addition für eine benutzerdefinierte Klasse durchzuführen, vergaß jedoch, den+-Operator zu überladen. Dies führte zu Kompilierungsfehlern beim ersten Aufruf mit dieser Klasse.
Geschichte
Bei der Entwicklung eines Containers auf Basis einer Klassenvorlage wurde eine Methode gemacht, die nicht vom Typ der Vorlage abhing, aber außerhalb der Klasse ohne ausdrückliche Spezialisierung ausgeführt wurde:template<> int MyContainer<int>::size() const { ... }Dies führte zu einem Linker-Fehler, da die Spezialisierung deklariert, aber nicht korrekt für alle Typen implementiert wurde.