Considérons la fonction suivante qui retourne la carré d'un entier passé
comme argument:
int carre(int x){ int c = x * x; return c; }
Nous voudrions disposer de cette fonction non seulement pour les variables
de type int
, mais aussi pour celles de type double
,
float
, etc. Pour tous ces types différents, la définition de la
fonction resterait la même, à ceci près que chaque occurence du mot
int
serait remplacé par double
, float
, etc.
Il est
possible de ne pas préciser dans une fonction le type d'un ou plusieurs
arguments mais de leur donner un nom générique pour les identifier et les
utiliser dans le corps de la fonction. A ce moment, lorsque la fonction
sera appelée, ce nom générique sera remplacé par le type adéquat. Pour cela
il faut remplacer la fonction précédente par:
template <class T> T carre(T x){ T c = x * x; return c; }
Ici, on a choisi T
pour désigner un type quelconque. La fonction
carre
prend maintenant un objet x
d'un type quelconque, et
renvoie un objet de même type. Entre temps, une variable c
a été
déclarée avec ce même type.
Il est également possible de passer plusieurs types en template. Par
exemple:
template <class T, class U> void f(int a, T b, U c, double d){ ... }