Académique Documents
Professionnel Documents
Culture Documents
Programmation générique
E. Lunéville
2022
« meta » programmation
version générique
modèle de fonction avec un type abstrait T
T est substituable par tout type y compris
des classes
Les opérations doivent être compatibles
avec le type substitué : T(0), <T(0 ), =T(0)
SIM201– Chapitre 5 1
« meta » programmation
SIM201– Chapitre 5 2
Programmation générique
Plan
Programmation générique des fonctions
Programmation générique des classes
Spécialisation partielle ou totale
Mécanismes de compilation
Un exemple complet : la classe complex de la STL
SIM201– Chapitre 5 3
Modèles de fonction
Syntaxe générale d’une fonction modèle
Les types abstraits T1,T2,... doivent tous intervenir dans la liste des arguments
entrée/sortie sous forme primaire ou dérivée (pointeur, référence)
char se convertit en int (code ASCII) ne peut pas deviner le type T (arg retour)
il faut l’expliciter le type T : fonc<char>
SIM201– Chapitre 5 4
Modèles de fonction
Il faut expliciter T1
Syntaxes équivalentes
typename séparé
class à la place
de typename
SIM201– Chapitre 5 5
Une fonction min générale
opérateur ternaire c ? v : f
pointeur de type T
constructeur
op. d’accès
SIM201– Chapitre 5 7
Classe modèle : instanciation d’un objet
A la compilation :
recherche le type Vect<double>
trouve template <typename T> class Vect
génère le code explicite en remplaçant T par double
compile le code généré
recherche le constructeur Vect<double>(int)
type composé : Vect< Vect<double> > pour un vecteur de vecteurs (matrice)
SIM201– Chapitre 5 8
Classe modèle : fonctionnalités
U+=V
SIM201– Chapitre 5 9
Fonction membre modèle
SIM201– Chapitre 5 10
Spécialisation d’une fonction modèle
générique
spécialisation partielle
SIM201– Chapitre 5 11
Spécialisation d’une fonction membre
SIM201– Chapitre 5 12
Spécialisation d’une classe modèle
générique
spécialisation partielle
spécialisation totale
SIM201– Chapitre 5 13
Programmation séparée et template
vecteur.h vecteur.cpp
SIM201– Chapitre 5 15
Programmation séparée et template
Comment faire ?
SIM201– Chapitre 5 16
Programmation séparée et template
main.cpp vecteur.hpp
déclaration
implémentation
compilation de main.cpp :
trouve la définition de vect<double> dans vecteur.hpp (T=double)
compile l’implémentation de vect avec T=double qui s’y trouve !
SIM201– Chapitre 5 17
Programmation séparée et template
main.cpp vecteur.cpp
vecteur.hpp
SIM201– Chapitre 5 18
Programmation séparée et template
implémentation
main.cpp vecteur.hpp vecteur.tem
non compilé
vecteur.cpp compilé
Compilation de vecteur.cpp :
génère les versions double et float avec une seule version
main.cpp pourra les trouver à l’édition de lien
SIM201– Chapitre 5 19
Programmation séparée et template
Autres méthodes
SIM201– Chapitre 5 20
Exemple : la classe complex de la STL
données privées
fonctions membres
SIM201– Chapitre 5 21
Exemple : la classe complex de la STL
SIM201– Chapitre 5 22
Exemple : la classe complex de la STL
SIM201– Chapitre 5 23
Exemple : la classe complex de la STL
Fonctions transcendantes
SIM201– Chapitre 5 24
Conclusion
SIM201– Chapitre 5 25