Skip to content

Latest commit

 

History

History
110 lines (91 loc) · 2.76 KB

File metadata and controls

110 lines (91 loc) · 2.76 KB

Templates

  • 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é
Cercle<int> c(2,10,10);
  • L’objet se manipule ensuite normalement
int r = c.getRayon();
  • 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.;