ProgrammierungC++ Entwickler

Was sind Vorlagen (Templates) in C++? Welche Arten von Vorlagen gibt es? Welche Schwierigkeiten und Fehler treten bei der Gestaltung und Nutzung von Vorlagen auf? Zeigen Sie ein Beispiel für eine Klassen- und eine Funktionsvorlage.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Funktionsvorlagen: erlauben es, eine Funktion für verschiedene Typen zu erstellen.
  • Klassen­vorlagen: ermöglichen die Erstellung von Klassen, die mit verschiedenen Typen arbeiten.
  • Vorlagen mit Wertparametern: man kann nicht nur mit Typen, sondern auch mit konstanten Werten parameterisieren.

Beispiel für eine Klassen­vorlage:

template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };

Beispiel für eine Funktions­vorlage:

template<class T> T add(const T& a, const T& b) { return a + b; }

Fangfrage.

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 }

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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 Klassen­vorlage 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.