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.
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) :
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 :
// 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
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.
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
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).
Afficher l'indice
Utilisez `template <>` pour indiquer la spécialisation totale de `Wrapper<char>`.
Solution disponible après 3 tentatives