next up previous contents
Next: Résolution de la surcharge Up: template en C++ Previous: Particulariser une instance d'un

Patron de fonction

Un patron de fonction permet de définir un ensemble de fonctions ; contrairement à l'instanciation pour les types issus de patrons, c'est le compilateur qui déterminera la fonction instanciée à partir des paramètres de l'appel :

template<class T> sort(vecteur<T> &){
     //...
}    // définition d'un tri sur un vecteur

class X{
//...
};

vecteur<int> vi(100);
vecteur<X> vx(200);
//...
void essai(){
  sort(vi);  // sort(vecteur<int>)
  sort(vx);  // sort(vecteur<X>)
};

Come on peut le remarquer, c'est assez proche du mécanisme de la surcharge : la différence essentielle est que le patron de fonction définit un nombre non borné de fonctions surchargées.

Il faut que le compilateur détermine à partir du type des paramètres quel sera exactement l'instanciation à générer, comme toujours dans ce cas se pose le problème des conversions :

template <class T>T max(T& a,T& b){
    return a>b?a:b;
 }
void main(){
    int a,b;
    char c;
    a=max(a,b);     // max(int,int)
    a=max(c,a);     // erreur
}

Contrairement aux patrons de classe, il faut que les arguments d'un patron de fonction soient obligatoirement des classes et figurent d'une manière ou d'une autre dans les arguments de la fonction (sinon comment le compilateur pourrait-il déterminer quelle instanciation réaliser ?).






Mon Oct 20 14:02:48 MET 1997