Passer au contenu principal
eLearner.app
Module 8 · Leçon 2 sur 218/18 dans le cours~15 min
Leçons du module (2/2)

Classes Modèles

Comme pour les fonctions, les classes peuvent également être paramétrées par rapport à un ou plusieurs types de données. Cela nous permet de définir des structures de données génériques (telles que des listes, des files, des piles ou des wrappers) qui fonctionnent avec n'importe quel type de données sans avoir à dupliquer le code.

Définition d'une classe template

Pour déclarer une classe template, nous utilisons la syntaxe template <typename T> immédiatement avant la définition de la classe. À l'intérieur de la classe, nous pouvons utiliser le paramètre de type T pour définir des variables membres, des types de retour ou des paramètres de fonctions membres.

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

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

Instanciation

Lorsque nous créons un objet d'une classe template, nous devons spécifier explicitement le type entre chevrons <> (bien qu'à partir de C++17, le compilateur puisse le déduire dans certains contextes via la Class Template Argument Deduction ou CTAD) :

Code
Box<int> intBox(10);        // T si converte in int
Box<double> doubleBox(3.14); // T si converte in double

Spécialisation des templates

Parfois, nous souhaitons un comportement différent pour une classe template lorsqu'elle est instanciée avec un type spécifique. Dans ce cas, nous définissons une spécialisation totale en utilisant la syntaxe template <> suivie de la définition de la classe dans laquelle nous spécifions le type cible :

Code
// Specializzazione totale per il tipo bool
template <>
class Box<bool> {
private:
    bool value;
public:
    Box(bool v) : value(v) {}

    void printState() {
        std::cout << (value ? "Vero" : "Falso");
    }
};

À vous de jouer

Exercice#cpp.m8.l2.e1
Tentatives : 0Chargement…

Déclarez une classe template appelée Box qui contient un membre privé appelé value de type T, un constructeur qui l'initialise et une méthode publique getValue() const qui renvoie la valeur.

Chargement de l'éditeur…
Afficher l'indice

N'oubliez pas de faire précéder la déclaration de la classe `Box` par `template <typename T>`.

Solution disponible après 3 tentatives

Exercice#cpp.m8.l2.e2
Tentatives : 0Chargement…

Déclarez une classe template Wrapper<T> avec un membre public data de type T, un constructeur Wrapper(T d) et une méthode print() qui affiche data sur std::cout. Ensuite, créez une spécialisation totale pour Wrapper<char> dans laquelle la méthode print() affiche le caractère entouré de guillemets simples (ex. 'A' au lieu de A).

Chargement de l'éditeur…
Afficher l'indice

Utilisez `template <>` pour indiquer la spécialisation totale de `Wrapper<char>`.

Solution disponible après 3 tentatives