Direct naar de hoofdinhoud
Module 8 · Les 2 van 218/18 in de cursus~15 min
Modulelessen (2/2)

Klassensjablonen

Net als functies kunnen ook klassen worden geparametriseerd met betrekking tot een of meer gegevenstypen. Hierdoor kunnen we generieke datastructuren (zoals lijsten, wachtrijen, stapels of wrappers) definiëren die met elk gegevenstype werken zonder code te dupliceren.

Een klassensjabloon definiëren

Om een ​​klassensjabloon te declareren, gebruiken we de syntaxis template <typename T> direct vóór de klassendefinitie. Binnen de klasse kunnen we de typeparameter T gebruiken om lidvariabelen, retourtypen of lidfunctieparameters te definiëren.

C++
template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}

    T getValue() const {
        return value;
    }
};

Instantiatie

Wanneer we een object van een klassensjabloon maken, moeten we het type expliciet specificeren tussen punthaken <> (hoewel de compiler begint met C++17, kan de compiler dit in sommige contexten afleiden via Class Template Argument Deduction of CTAD):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

Sjabloonspecialisatie

Soms willen we een ander gedrag voor een klassensjabloon wanneer deze wordt geïnstantieerd met een specifiek type. In dit geval definiëren we een totale specialisatie met behulp van de syntaxis template <>, gevolgd door de klassendefinitie die het doeltype specificeert:

C++
// Total specialization for the bool type
template <>
class Box<bool> {
private:
    bool value;
public:
    Box(bool v) : value(v) {}

    void printState() {
        std::cout << (value ? "True" : "False");
    }
};

Probeer het zelf

Oefening#cpp.m8.l2.e1
Pogingen: 0Laden…

Declareer een klassensjabloon met de naam Box die een privélid met de naam waarde van het type T bevat, een constructor die deze initialiseert, en een openbare methode getValue() const die de waarde retourneert.

Editor laden…
Toon hint

Vergeet niet om `template <typenaam T>` voor te voegen aan de klassedeclaratie `Box`.

Oplossing beschikbaar na 3 pogingen

Oefening#cpp.m8.l2.e2
Pogingen: 0Laden…

Declareer een klassensjabloon Wrapper<T> met openbare lidgegevens van het type T, een constructor Wrapper(T d) en een print()-methode die gegevens afdrukt naar std::cout. Maak vervolgens een totale specialisatie voor Wrapper<char> waarbij de methode print() het teken tussen enkele aanhalingstekens afdrukt (bijvoorbeeld 'A' in plaats van A).

Editor laden…
Toon hint

Gebruik `template <>` om de totale specialisatie van `Wrapper<char>` aan te geven.

Oplossing beschikbaar na 3 pogingen