• Aucun résultat trouvé

L’instanciation peut être implicite lorsque le contexte permet au compilateur de décider de l’instance de modèle à choisir.

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

Objectifs

Documents relatifs