- On peut avoir besoin d’exécuter un même code pour différents type de variable ou de classe. (Par exemple pour trouver le min entre deux entiers ou deux double)
- Il existe pour cela un mécanisme de template qui permet d’écrire du code sans préciser le type
- La syntaxe est
template<typename T>
- Dans la plupart des cas, on peut écrire class à la place de typename
- On peut se servir des templates aussi bien sur des fonctions que sur des classes
template <typename T>
T minimum(const T& a, const T& b) {
if(a<b)
return a;
else
return b;
}
int main() {
double pi =3.14, e = 2.71;
cout << minimum<double>(pi,e) << endl; //Utilise la "version double" de la fonction.
int a = 2, b = 50;
cout << minimum<int>(a,b) << endl; // Utilise la "version int"
return 0;
}
- Les fonctions template doivent être définies dans un fichier .h
- Le compilateur va générer une fonction / classe par type différent rencontré dans le code (et pour ceux là seulement)
- Il est nécessaire que les opérateurs utilisés dans les classes ait du sens pour les classes utilisées (appeler minimum sur des objets de la classe Chien n’a pas de sens)
- Lors de l’appel d’une fonction template, il n’est pas obligatoire de préciser le type si celui-ci est explicite
int a=3, b =5;
minimum(a,b); // le type est automatiquement déduit de a et b
template <typename T>
class Cercle{
private:
T rayon;
T centre[2];
public:
Cercle (T r, T cx, T cy);
T getRayon();
}
//on reste dans le fichier .h pour le code qui suit
template <typename T>
Cercle<T>::Cercle(T r, T cX, T cY):rayon(r),centre[0](cX),centre[1](cY){
}
template <typename T>
T Cercle<T>::getRayon{
return rayon;
}
- Pour instancier un objet d’une classe template, on précise le type du paramètre template utilisé
- L’objet se manipule ensuite normalement
- Une fonction/classe template peut avoir plusieurs paramètres template
template <typename T, typename U>
class Cercle{
private:
T rayon;
U centre[2];
public:
Cercle (T r, U cx, U cy);
T getRayon();
};
//on reste dans le fichier .h pour le code qui suit
template <typename T, typename U>
Cercle<T,U>::Cercle(T r, U cX, U cY):rayon(r){
centre[0]=cX;
centre[1]=cY;
}
- Les paramètres template peuvent être de type constante
template <int N>
class Point{
double coords [N];
public :
double & operator[]( const unsigned int i);
};
template <int N>
double & Point <N >::operator[]( const unsigned int i){
assert (i<N);
return coords [i];
}
Point<2> P;
P[0] = 1.; P[1] = 1.;