Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 2 von 218/18 im Kurs~15 min
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.

Code
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):

Code
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:

Code
// 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

Übung#cpp.m8.l2.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
Hinweis anzeigen

Denke daran, der Deklaration der Klasse `Box` `template <typename T>` voranzustellen.

Lösung nach 3 Versuchen verfügbar

Übung#cpp.m8.l2.e2
Versuche: 0Wird geladen…

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).

Editor wird geladen…
Hinweis anzeigen

Verwende `template <>` um die vollständige Spezialisierung von `Wrapper<char>` anzuzeigen.

Lösung nach 3 Versuchen verfügbar