Chaque fois qu’on utilise une fonction ayant un nom de patron, le compilateur cherche à
utiliser ce patron pour créer (instancier) une fonction adéquate. Pour ce faire, il
cherche à réaliser une correspondance absolue des types : aucune conversion, qu’il
s’agisse de promotion numérique ou de conversion standard n’est permise ; qui plus
est, les qualifieurs const et volatile doivent être exactement les mêmes.
Voici des exemples utilisant notre patron précédent :
int n, p ; float x ; char c ;
int * adi ; float * adf ;
class point ; point p ; point * adp ;
fct (n, adi, x) ; // instancie la fonction void fct (int, int *, float)
fct (n, adi, p) // instancie la fonction void fct (int, int *, int)
fct (x, adf, p) ; // instancie la fonction void fct (float, float *, int)
fct (c, adi, x) ; // erreur char et int * ne correspondent pas à T et T*
// ( pas de conversion)
fct (&n, &adi, x) ; // instancie la fonction void fct (int *, int * *, float)
fct (p, adp, n) ; // instancie la fonction void fct (point, point *, int)
D’une manière générale, il est nécessaire que chaque paramètre de type apparaisse
au moins une fois dans l’en-tête du patron.
La définition d’un patron de fonctions ne peut pas être compilée seule ; de toute façon,
elle doit être connue du compilateur pour qu’il puisse instancier la bonne fonction
patron. En général, les définitions de patrons de fonctions figureront dans des fichiers
d’extension h, de façon à éviter d’avoir à en fournir systématiquement la liste.
Les paramètres expression d'un patron de fonctions
Ils ont été introduits par la norme. Un paramètre expression d’un patron de fonctions se
présente comme un argument usuel de fonction ; il n’apparaît pas dans la liste de
paramètres de type (template) et il doit apparaître dans l’en-tête du patron. Par exemple :
template int compte (T * tab, int n)
{ // ici, on peut se servir de la valeur de l'entier n
// comme on le ferait dans n'importe quelle fonction ordinaire
}
Un patron de fonctions peut disposer d’un ou de plusieurs paramètres expression. Lors
de l’appel, leur type n’a plus besoin de correspondre exactement à celui attendu : il
suffit qu’il soit acceptable par affectation, comme dans n’importe quel appel d’une
fonction ordinaire.
Surdéfinition de patrons de fonctions et spécialisation de
302
utiliser ce patron pour créer (instancier) une fonction adéquate. Pour ce faire, il
cherche à réaliser une correspondance absolue des types : aucune conversion, qu’il
s’agisse de promotion numérique ou de conversion standard n’est permise ; qui plus
est, les qualifieurs const et volatile doivent être exactement les mêmes.
Voici des exemples utilisant notre patron précédent :
int n, p ; float x ; char c ;
int * adi ; float * adf ;
class point ; point p ; point * adp ;
fct (n, adi, x) ; // instancie la fonction void fct (int, int *, float)
fct (n, adi, p) // instancie la fonction void fct (int, int *, int)
fct (x, adf, p) ; // instancie la fonction void fct (float, float *, int)
fct (c, adi, x) ; // erreur char et int * ne correspondent pas à T et T*
// ( pas de conversion)
fct (&n, &adi, x) ; // instancie la fonction void fct (int *, int * *, float)
fct (p, adp, n) ; // instancie la fonction void fct (point, point *, int)
D’une manière générale, il est nécessaire que chaque paramètre de type apparaisse
au moins une fois dans l’en-tête du patron.
La définition d’un patron de fonctions ne peut pas être compilée seule ; de toute façon,
elle doit être connue du compilateur pour qu’il puisse instancier la bonne fonction
patron. En général, les définitions de patrons de fonctions figureront dans des fichiers
d’extension h, de façon à éviter d’avoir à en fournir systématiquement la liste.
Les paramètres expression d'un patron de fonctions
Ils ont été introduits par la norme. Un paramètre expression d’un patron de fonctions se
présente comme un argument usuel de fonction ; il n’apparaît pas dans la liste de
paramètres de type (template) et il doit apparaître dans l’en-tête du patron. Par exemple :
template
{ // ici, on peut se servir de la valeur de l'entier n
// comme on le ferait dans n'importe quelle fonction ordinaire
}
Un patron de fonctions peut disposer d’un ou de plusieurs paramètres expression. Lors
de l’appel, leur type n’a plus besoin de correspondre exactement à celui attendu : il
suffit qu’il soit acceptable par affectation, comme dans n’importe quel appel d’une
fonction ordinaire.
Surdéfinition de patrons de fonctions et spécialisation de
302
