« Programmation C++/Les templates » : différence entre les versions

Contenu supprimé Contenu ajouté
Gzen92 (discussion | contributions)
Aucun résumé des modifications
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 14 :
 
Exemple avec un patron de fonction calculant la valeur maximale d'un tableau de données (le type étant le paramètre du patron de fonction) :
<sourcesyntaxhighlight lang="cpp">
template<class T>
T max(T array[], int length)
Ligne 24 :
return vmax;
}
</syntaxhighlight>
</source>
Le type <code>class</code> utilisé pour le paramètre <code>T</code> est en fait un type de données, pas forcément une classe.
La norme a introduit plus tard le mot clé <code>typename</code> qui peut venir se substituer à <code>class</code> dans ce cas-là.
 
Exemple d'utilisation :
<sourcesyntaxhighlight lang="cpp">
int values[]={ 100, 50, 35, 47, 92, 107, 84, 11 };
 
cout << max(values, 8);
</syntaxhighlight>
</source>
Le compilateur crée une fonction max à partir du type des arguments, en remplaçant le paramètre <code>T</code> par le type <code>int</code> dans le cas précédent.
Après remplacement le compilateur génère la fonction suivante :
<sourcesyntaxhighlight lang="cpp">
int max(int array[], int length)
{
Ligne 45 :
return vmax;
}
</syntaxhighlight>
</source>
Si on utilise la fonction <code>max</code> avec différents types (<code>int</code>, <code>double</code>, ...), le compilateur générera autant de fonctions.
Les patrons permettent donc d'éviter d'écrire plusieurs fonctions pour chaque type de donnée traité. Quand on sait que la duplication inutile de code est source d'erreur, on comprend l'intérêt de mettre en facteur plusieurs fonctions potentielles dans un même patron de fonction.
Ligne 53 :
 
Exemple d'une classe gérant un tableau de données :
<sourcesyntaxhighlight lang="cpp">
template<class T,int maxsize>
class CDataArray
Ligne 68 :
int length;
};
</syntaxhighlight>
</source>
L'implémentation du constructeur et des méthodes de la classe exige une syntaxe un peu plus complexe.
Par exemple, pour le constructeur :
<sourcesyntaxhighlight lang="cpp">
template<class T,int maxsize>
CDataArray<T,maxsize>::CDataArray()
: length(0) // Liste d'initialisation des données membres
{}
</syntaxhighlight>
</source>
La première ligne rappelle qu'il s'agit d'un patron de classe.
Le nom du constructeur est précédé du nom de la classe suivi des paramètres du patron de classe, afin que le compilateur détermine de quelle classe il s'agit.
Ligne 82 :
 
Les méthodes sont implémentées de manière identique :
<sourcesyntaxhighlight lang="cpp">
template<class T,int maxsize>
int CDataArray<T,maxsize>::getSize()
Ligne 102 :
return true;
}
</syntaxhighlight>
</source>
Contrairement aux patrons de fonctions, l'instanciation d'un patron de classe exige la présence de la valeur des paramètres à la suite du nom de la classe.
 
Exemple :
<sourcesyntaxhighlight lang="cpp">
CDataArray<int,100> listeNumeros;
 
Ligne 113 :
 
cout << listeNumeros.getSize() << endl;
</syntaxhighlight>
</source>
Le compilateur génère une classe pour chaque ensemble de valeurs de paramètres d'instanciation différent.