fonctions de patrons
On peut définir plusieurs patrons de même nom, possédant des paramètres (de type ou
expression) différents. La seule règle à respecter dans ce cas est que l’appel d’une
fonction de ce nom ne doit pas conduire à une ambiguïté : un seul patron de fonctions
doit pouvoir être utilisé à chaque fois.
Par ailleurs, il est possible de fournir la définition d’une ou plusieurs fonctions
particulières qui seront utilisées en lieu et place de celle instanciée par un patron. Par
exemple, avec :
template T min (T a, T b) // patron de fonctions
{ ... }
char * min (char * cha, char * chb) // version spécialisée pour le type char *
{ ... }
int n, p;
char * adr1, * adr2 ;
min (n, p) // appelle la fonction instanciée par le patron général
// soit ici : int min (int, int)
min (adr1, adr2) // appelle la fonction spécialisée
// char * min (char *, char *)
Algorithme d’instanciation ou d’appel d’une fonction
Précisons comment doivent être aménagées les règles de recherche d’une fonction
surdéfinie, dans le cas où il existe un ou plusieurs patrons de fonctions.
Lors d’un appel de fonction, le compilateur recherche tout d’abord une correspondance
exacte avec les fonctions « ordinaires ». S’il y a ambiguïté, la recherche échoue
(comme à l’accoutumée). Si aucune fonction « ordinaire » ne convient, on examine
alors tous les patrons ayant le nom voulu (en ne considérant que les paramètres de
type). Si une seule correspondance exacte est trouvée, la fonction correspondante est
instanciée (du moins, si elle ne l’a pas déjà été) et le problème est résolu. S’il y en a
plusieurs, la recherche échoue.
Enfin, si aucun patron de fonction ne convient, on examine à nouveau toutes les
fonctions « ordinaires » en les traitant cette fois comme de simples fonctions
surdéfinies (promotions numériques, conversions standard…).
303
On peut définir plusieurs patrons de même nom, possédant des paramètres (de type ou
expression) différents. La seule règle à respecter dans ce cas est que l’appel d’une
fonction de ce nom ne doit pas conduire à une ambiguïté : un seul patron de fonctions
doit pouvoir être utilisé à chaque fois.
Par ailleurs, il est possible de fournir la définition d’une ou plusieurs fonctions
particulières qui seront utilisées en lieu et place de celle instanciée par un patron. Par
exemple, avec :
template
{ ... }
char * min (char * cha, char * chb) // version spécialisée pour le type char *
{ ... }
int n, p;
char * adr1, * adr2 ;
min (n, p) // appelle la fonction instanciée par le patron général
// soit ici : int min (int, int)
min (adr1, adr2) // appelle la fonction spécialisée
// char * min (char *, char *)
Algorithme d’instanciation ou d’appel d’une fonction
Précisons comment doivent être aménagées les règles de recherche d’une fonction
surdéfinie, dans le cas où il existe un ou plusieurs patrons de fonctions.
Lors d’un appel de fonction, le compilateur recherche tout d’abord une correspondance
exacte avec les fonctions « ordinaires ». S’il y a ambiguïté, la recherche échoue
(comme à l’accoutumée). Si aucune fonction « ordinaire » ne convient, on examine
alors tous les patrons ayant le nom voulu (en ne considérant que les paramètres de
type). Si une seule correspondance exacte est trouvée, la fonction correspondante est
instanciée (du moins, si elle ne l’a pas déjà été) et le problème est résolu. S’il y en a
plusieurs, la recherche échoue.
Enfin, si aucun patron de fonction ne convient, on examine à nouveau toutes les
fonctions « ordinaires » en les traitant cette fois comme de simples fonctions
surdéfinies (promotions numériques, conversions standard…).
303
