Vous êtes sur la page 1sur 21

Chapitre 5: Templates (Patrons)

1
Introduction
Pour améliorer la réutilisabilité des codes, le C++ propose la
notion de généricité qui permet d’écrire du code générique en
paramétrant des fonctions et des classes par un type de
données. Un modèle générique (d’une fonction ou d’une classe),
n’est alors pas directement utilisable : c’est plutôt un template
(Patron) du programme qui sera «instancié » par les types de
paramètres qu’il accepte. Dans ce chapitre, nous abordons les
templates de fonctions et de classes.

2
Introduction
Position du problème :
Si on définit une fonction avec des attributs int, et on désire avoir la
même fonction mais avec des attributs de type float, on doit
reconstruire une nouvelle fonction.
Solution:
Pour éviter la réécriture de plusieurs surcharges de la fonction, on peut
utiliser un Template (Patron) de la fonction.
Le template décrit une interface et un modèle pour construire des
fonctions et des classes en C++.
Le type des attributs devient un paramètre symbolique
3
Fonction Template
Définition:
Un template d'une fonction est une fonction dont le type de
retour et le type des arguments n'est pas fixé. Il constitue une
alternative à la surcharge (ou la redéfinition), qui permet donc
de gagner en performances, en temps de codage, et surtout en
clarté.

 Pour comprendre ce principe, écrivons une fonction qui


nous permettra de calculer la somme de deux nombres (de
type int), puis de renvoyer le résultat.
4
Fonction Template
Exemple: Fonction initiale

calculSom reçoit deux arguments int et


renvoie un résultat int. Si on veut faire la
somme de deux paramètres de type
Surcharge de la fonction
double, on doit surcharger la fonction.
On peut facilement se rendre compte que
les fonctions (initiale et surchargée) sont
formées sur le même modèle qui a la
Modèle de la fonction
forme suivante:

5
Fonction Template
Syntaxe :
Nous allons déclarer un template qui englobe toutes les formes de la
fonction calculSom.

Remarque:
Les paramètres par1 et par2, n’ont pas un type prédéfini mais ils
doivent cependant, avoir le même Type.
6
Fonction Template
Exemple:

7
Fonction Template

Les paramètres:
Il est possible de définir un
template avec des arguments
de types différents. Par
exemple, additionner un int
avec un double, on obtient les
formes suivantes:

8
Fonction Template
Les paramètres:

Pour éviter l’utilisation de plusieurs surcharges du template , on


peut définir un template qui accepte plusieurs types
d’arguments.

9
Fonction Template
Exemple:

10
Fonction Template
Remarque:
Notre fonction template renvoie une donnée de type Type2. Si l'on envoie a en
deuxième argument, le type de retour devient donc int. Ainsi, la valeur de b est
transformée en int (au lieu de float). Aussi, Type1 et Type2 peuvent être le même
type.

Surcharger un Template:
Les fonctions templates sont avant tout des fonctions, ce qui induit qu'elles peuvent
être surchargées. Si l'on reprend la fonction calculSom, il nous est possible de la
surcharger par exemple comme ceci:

11
Fonction Template
Exercice 1:
Créer un template de
fonctions permettant de
calculer la somme d’un
tableau d’éléments de
type quelconque. Le
template reçoit en
argument le tableau et le
nombre d’éléments de ce
tableau.

12
Classe Template
Introduction:
La déclaration et la définition d'une classe template se font comme celles d'une
fonction template : elles doivent être précédées par la déclaration template des
types génériques. Une classe template est une classe dans laquelle le Type des
attributs peut changer.
Exemple:
Pour bien comprendre le fonctionnement de la classe template, reprenons la

classe rectangle qu’on a déjà utilisée. Un rectangle possède deux attributs :une

largeur et une hauteur, qui permettent de calculer la surface et le périmètre. On

peut avoir les méthodes Move et Zoom, pour déplacer et changer la taille du

rectangle. 13
Classe Template
Déclarations:
Remarque:
Pour définir la méthode à l’extérieur de la
classe on utilise la forme suivante:

14
Classe Template
Le type des attributs: Classe rectangle
Maintenant que nous avons modélisé la
classe, il est temps de réfléchir aux Attributs: Largeur, Hauteur
types des attributs. Méthodes: Move, Zoom

Si l'on souhaite avoir une bonne


précision, alors il faut utiliser des double
ou des float. Si par contre on considère
la taille en pixels, on peut se dire que La classe template peut
être instanciée par le
l'utilisation de int est largement compilateur avec
suffisante différents types

15
Classe Template
Constructeur:

Remarque:
Comme toute classe
simple, on peut définir
le constructeur à
l’intérieur ou à
l’extérieur de la classe

16
Classe Template
Instanciation d'une classe template:

18
Classe Template
Exercice 2:
On considère un template d’une classe
Point tel que:
Créer un template de classe Cercle qui
manipule le template Point pour définir
le centre. Cercle doit contenir un
constructeur et une fonction qui
affiche les attributs du cercle. Les
coordonnées et le rayon peuvent avoir
des types différents. 19
Classe Template

Exercice 3 : (Examen 2017)


1. Créer un template d’une classe cercle qui admet deux types
de données T et U. La classe possède un attribut rayon de
type T. Un constructeur qui initialise l’attribut.
2. Imbriquer un template d’une classe ellipse qui utilise le type
U pour ses deux attributs R1 et R2 qui définissent les axes de
l’ellipse. Doter la classe d’un constructeur qui initialise les
attributs et une fonction surface sans arguments qui renvoie
la surface de l’ellipse (3.14*R1*R2) de type U.
22
Classe Template
Exercice 3:
3. Ajouter un template d’une classe cylindre qui hérite de cercle
et qui admet aussi deux types de données T et U. cylindre
possède un attribut hauteur. Ajouter dans l’interface de cette
classe un constructeur qui initialise les attributs et une fonction
volume sans arguments qui renvoie le volume du cylindre
(3.14*rayon*rayon*hauteur) de type U.
4. Dans main, instancier les classes cylindre et ellipse et afficher
les valeurs retournées par surface et volume.
23
Conclusion
En C++, les patrons sont très utilisés dans la bibliothèque STL
(Standard Template Library) pour définir tous les types de
containers (ou conteneurs comme les listes, les tables, les piles,
etc.), et des algorithmes génériques. Ils permettent d’utiliser le
même algorithme avec différents types de données sans la
nécessité de la surcharge.
Dans le chapitre suivant, nous allons aborder les notions des
conteneurs, des itérateurs, des foncteurs et quelques algorithmes
de la STL.
24

Vous aimerez peut-être aussi