Lektionen des Moduls (2/2)
Klassen-Templates
Wie bei Funktionen können auch Klassen in Bezug auf einen oder mehrere Datentypen parametrisiert werden. Dies ermöglicht es uns, generische Datenstrukturen (wie Listen, Warteschlangen, Stapel oder Wrapper) zu definieren, die mit jedem beliebigen Datentyp funktionieren, ohne dass der Code dupliziert werden muss.
Definition einer Template-Klasse
Um eine Template-Klasse zu deklarieren, verwenden wir die Syntax template <typename T> unmittelbar vor der Klassendefinition. Innerhalb der Klasse können wir den Typparameter T verwenden, um Elementvariablen, Rückgabetypen oder Parameter von Elementfunktionen zu definieren.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};
Instanziierung
Wenn wir ein Objekt einer Template-Klasse erstellen, müssen wir den Typ explizit in spitzen Klammern <> angeben (obwohl der Compiler diesen ab C++17 in einigen Kontexten durch Class Template Argument Deduction bzw. CTAD automatisch folgern kann):
Box<int> intBox(10); // T wird zu int
Box<double> doubleBox(3.14); // T wird zu double
Template-Spezialisierung
Manchmal wünschen wir uns für eine Template-Klasse ein anderes Verhalten, wenn sie mit einem bestimmten Typ instanziiert wird. In diesem Fall definieren wir eine vollständige Spezialisierung (explicit specialization) mithilfe der Syntax template <> gefolgt von der Klassendefinition, in der wir den Zieltyp angeben:
// Vollständige Spezialisierung für den Typ bool
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "Vero" : "Falso");
}
};
Probier es aus
Deklariere eine Template-Klasse namens Box, die ein privates Element namens value vom Typ T, einen Konstruktor zu dessen Initialisierung und eine öffentliche Methode getValue() const enthält, die den Wert zurückgibt.
Hinweis anzeigen
Denke daran, der Deklaration der Klasse `Box` `template <typename T>` voranzustellen.
Lösung nach 3 Versuchen verfügbar
Deklariere eine Template-Klasse Wrapper<T> mit einem öffentlichen Element data vom Typ T, einem Konstruktor Wrapper(T d) und einer Methode print(), die data auf std::cout ausgibt. Erstelle anschließend eine vollständige Spezialisierung für Wrapper<char>, bei der die Methode print() das Zeichen in einfachen Anführungszeichen ausgibt (z. B. 'A' statt A).
Hinweis anzeigen
Verwende `template <>` um die vollständige Spezialisierung von `Wrapper<char>` anzuzeigen.
Lösung nach 3 Versuchen verfügbar