Templates de fonctions

De RAD Studio
Aller à : navigation, rechercher

Remonter à Présentation des templates de fonctions - Index

Considérons une fonction max(x,y) qui renvoie le plus grand de ses deux arguments. x et y peuvent être de n'importe quel type et peuvent être ordonnés. Néanmoins, comme C++ est un langage fortement typé, les types des paramètres x et y doivent être déclarés au moment de la compilation. Si vous n'utilisez pas de template, vous devrez avoir recours à de nombreuses versions surchargées de max, une pour chaque type de données devant être supporté, même si le code est identique pour chaque version. Les versions comparent les arguments et renvoient le plus grand.

Pour contourner ce problème, vous pouvez utiliser la macro :



 #define max(x,y) ((x > y) ? x : y)



Néanmoins, en utilisant #define, vous contournez le mécanisme de contrôle de type qui est en fait une amélioration du C++ par rapport au C. En fait, ce cas d'utilisation de macros dans C++, est presque obsolète. Le but de max(x,y) est de comparer des types compatibles. Malheureusement, la macro permet de comparer un int et un struct qui sont incompatibles.

En outre, avec les macros, vous risquez d'effectuer des substitutions à des endroits indésirables. En revanche, si vous utilisez un template, vous pouvez définir une structure pour une famille de fonctions surchargées associées, en laissant le type de données lui-même être un paramètre :



 template <class T> T max(T x, T y){
    return (x > y) ? x : y;
    };



Le type de données est représenté par l'argument du template : <class T>. Lorsqu'il est utilisé dans une application, le compilateur génère la fonction appropriée suivant le type de données utilisé dans l'appel :



 int i;
 Myclass a, b;
 int j = max(i,0);       // les arguments sont des entiers
 Myclass m = max(a,b);   // les arguments sont de type Myclass



Vous pouvez utiliser tout type de données (pas uniquement une classe) pour <class T>. Le compilateur prend soin d'appeler l'operator>() approprié. Vous pouvez donc utiliser max avec les arguments du type pour lequel operator>() est défini.

Voir aussi