Par exemple, dans le code :
double da(2.3), db(4.5) ;
echange(da,db) ;
il est clair (par le contexte) qu’il s’agit de l’instance
echange<double>du modèle
template<typename T> void echange(T&,T&) ;qu’il faut
utiliser.
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Instanciation des modèles
Mais dans la plupart des cas, onexplicite l’instanciationlors de la déclaration d’un objet.
C’est ce qui vous faites lorsque vous déclarez par exemple
vector<double> tableau ;
Il suffit dans ce cas de spécifier le(s) type(s) désiré(s) après le nom du modèle de classe et entre<>.
L’instanciation explicite peut aussi être utile dans les cas où le contexte n’est pas suffisamment clair pour choisir.
Par exemple avec le modèle de fonction
template <typename Type>
Type monmax(const Type& x, const Type& y) { if (x < y) return y ;
else return x ; }
l’appelmonmax(3.14, 7) ;est ambigu. Il faudra alors écrire
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Modèles, surcharge et
spécialisation
Les modèles de fonctions peuvent très bien être surchargés comme les fonctions usuelles (puisque, encore une fois, ce sont juste une façon condensée d’écrire plein de fonctions à la fois). Par exemple :
template<typename Type> void affiche(const Type& t) {
cout << "J’affiche " << t << endl ; }
// surcharge pour les pointeurs : on préfère ici écrire // le contenu plutôt que l’adresse.
template<typename Type> void affiche(Type* t) { cout << "J’affiche " << *t « endl ;
}
Rq. : on aurait même pu faire mieux en écrivant :
template<typename Type> void affiche(Type* t) { affiche<Type>(*t) ;
}
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Modèles, surcharge et
spécialisation
Mais les modèles (y compris les modèles de classes) offrent un mécanisme supplémentaire : laspécialisationqui permet de définir uneversion particulièred’une classe ou d’une fonction pour un choix spécifique des paramètres du modèle.
Par exemple, on pourrait spécialiser le second modèle ci-dessus dans le cas des pointeurs sur des entiers :
template<> void affiche<int>(int* t) {
cout << "J’affiche le contenu d’un entier : " << *t << endl ; }
La spécialisation d’un modèle (lorsqu’elle est totale) se fait en :
• ajoutanttemplate<>devant la définition
• nommant explicitement la classe/fonction spécifiée C’est le<int>aprèsaffichedans l’exemple ci-dessus.
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Exemple de spécialisation de
classe
template<typename T1, typename T2> class Paire { ... } ;// spécialisation pour les paires <string,int> template<> class Paire<string,int> { public :
Paire(const string& un, int deux) : premier(un), second(deux) {} virtual∼Paire() {}
string get1() const { return premier ; } int get2() const { return second ; }
void set1(const string& val) { premier = val ; } void set2(int val) { second = val ; }
// une méthode de plus void add(int i) { second += i ; } protected :
string premier ; int second ; } ;
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Spécialisation : remarques
• La spécialisation peut également s’appliquer uniquement à une méthode d’un modèle de classe sans que l’on soit obligé de spécialiser toute la classe.
Utilisée de la sorte, la spécialisation peut s’avérer particulièrement utile.
• La spécialisation n’est pas une surcharge car il n’y a pas génération de plusieurs fonctions de même nom (de plus que signifie une surcharge dans le cas d’une classe ?) mais bien uneinstance spécifiquedu modèle.
• il existe aussi desspécialisations partielles(de classe ou de fonctions), mais cela nous emmènerait trop loin dans ce cours.
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Modèles de classes et
compilation séparée
Les modèles de classes doivent nécessairement être définis au moment de leur instanciation afin que le compilateur puisse générer le code correspondant.
Ce qui implique, lors de compilation séparée, que les fichiers d’en-tête (.h) doivent contenir non seulement la déclaration,mais également la définition complètede ces modèles ! !
On ne peut donc pas séparer la déclaration de la définition dans différents fichiers... Ce qui présente plusieurs inconvénients :
• Lesmêmesinstances de modèles peuvent êtrecompilées plusieurs fois,
• et se retrouvent en demultiples exemplairesdans les fichiers exécutables.
• On ne peut plus cacher leurs définitions (par exemple pour des raisons de confidentialité, etc...)
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Modèles de classes et
compilation séparée
Notez également que les fichiers contenant des modèles ne sont pas des fichiers sources classiques, puisque sans instanciation, ils ne génèrent aucun code machine.
Pour résoudre ces problèmes, le langage C++ donne en principe la possibilité d’exporter les définitionsdes modèles dans des fichiers complémentaires à l’aide de la directiveexport.
Malheureusement celle-ci n’est pour l’instant pas gérée par les compilateurs actuels :
warning : keyword ’export’ not implemented, and will be ignored
En l’état, il faut donc joindre prototype et définitions des modèles dans les mêmes fichiers d’en-tête.
Le seul « point noir » des templates est donc lié à la faiblesse des compilateurs actuels qui ne gèrent pas la directiveexport.
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie
Récapitulatif
Déclarer un modèle de classe ou de fonction :
template<typename nom1, typename nom2, ...>
Définition externe des méthodes de modèles de classes :
template<typename nom1, typename nom2, ...> NomClasse<nom1, nom2, ...> : : NomMethode(...
Instanciation : spécifier simplement les types voulus après le nom de la classe/fonction, entre<>(Exemple :vector<double>) Spécialisation (totale) de modèle pour les types type1, type2... :
template<> NomModele<type1,type2,...> ...suite de la declaration...
Compilation séparée : pour les templates, il faut tout mettre (déclarations et définitions) dans le fichier d’en-tête (.h).
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie 1
Introduction
2
Surcharges des opérateurs
3
Structures de Données Abstraites
4
Collection et Templates
5
STL : Standard Template Library
6
Gestion des exceptions
Introduction Surcharges Dynamique Template STL Exceptions Bibliographie