D e m ê m e q u'il est possible de surdé finir une fonction classique, il est possible de surdé finir un patron de fonctions, c'est-à -dire de définir plusieurs patrons possédant des argum e nts diffé re nts. O n note ra q ue ce tte situation conduit e n fait à définir plusieurs "fam illes" de fonctions (il y a bie n plusieurs définitions de fam illes, e t non plus sim plem e nt plusieurs définitions de fonctions) ;e lle ne doit pas ê tre confondue ave c la spécialisation d'un patron de fonctions q ui consiste à surdéfinir une ou plusieurs des fonctions de la fam ille e t q ue nous étudie rons dans le paragraph e suivant.
4.1 Exe m ple s de s urdé finition de patron de fonctions ne com portant q ue de s
param è tre s de type
XI. Le s patrons de fonctions 181
• d'une pre m iè re fam ille de fonctions à deux argum e nts de m ê m e type q ue lconq ue (com m e dans nos pré cédents exe m ples),
• d'une seconde fam ille de fonctions à trois argum e nts de m ê m e type q ue lconq ue .
_______________________________________________________________________________ ____
#include <iostream.h> // patron numero I
template <class T> T min (T a, T b) {
if (a < b) return a ; else return b ; }
// patron numero II
template <class T> T min (T a, T b, T c) {
return min (min (a, b), c) ; }
main() {
int n=12, p=15, q=2 ;
float x=3.5, y=4.25, z=0.25 ;
cout << min (n, p) << "\n" ; // patron no I int min (int, int) cout << min (n, p, q) << "\n" ; // patron no II int min (int, int, int) cout << min (x, y, z) << "\n" ; // patron no II float min (float, float, float)
}
_______________________________________________________________________________ ____
Exe m ple de surdéfinition de patron de fonctions (1)
D 'une m aniè re gé né rale, on pe ut surdéfinir des patrons possédant un nom bre diffé re nt de param è tres de type (dans notre e xe m ple, il n'y e n avait q u'un dans ch aq ue patron m in) e t les en-tê tes des fonctions correspondantes pe uve nt ê tre aussi varié s q u'on le désire . M ais il est souh aitable q u'il n'y ait aucun re coupe m e nt e ntre les diffé re ntes fam illes de fonctions correspondant à ch aq ue patron. Si te l n'est pas le cas, une am biguïté ris q ue d'apparaître ave c ce rtains appe ls.
Voici un autre e xe m ple dans leq ue l nous avons défini plusieurs patrons de fonctions m in à deux argum e nts, afin de traite r conve nablem e nt les trois situations suivantes :
• deux valeurs de m ê m e type (com m e dans les paragraph es pré cédents), • un pointe ur sur une valeur d'un type donné et une valeur de ce m ê m e type , • une valeur d'un type donné et un pointe ur sur une valeur de ce m ê m e type .
_______________________________________________________________________________ ____
#include <iostream.h> // patron numéro I
template <class T> T min (T a, T b) { if (a < b) return a ;
else return b ; }
// patron numéro II
template <class T> T min (T * a, T b) { if (*a < b) return *a ;
else return b ; }
// patron numéro III
template <class T> T min (T a, T * b) { if (a < *b) return a ; else return *b ; } main() { int n=12, p=15 ; float x=2.5, y=5.2 ;
cout << min (n, p) << "\n" ; // patron numéro I int min (int, int) cout << min (&n, p) << "\n" ; // patron numéro II int min (int *, int) cout << min (x, &y) <<"\n" ; // patron numéro III float min (float, float *)
cout << min (&n, &p) << "\n" ; // patron numéro I int * min (int *, int *) } ________________________________ 12 12 2.5 0x210d2336 _______________________________________________________________________________ ____
Exe m ple de surdéfinition de patron de fonctions (2)
Les trois prem ie rs appe ls ne posent pas de problèm e . En re vanch e , un appe l te l que m in (& n, & p) conduit à instancie r, à l'aide du patron num é ro I la fonction :
int * min (int *, int *)
La valeur fournie alors par l'appe l en q uestion est la plus petite des deux valeurs (de type int *) & n e t & p. Il est probable q ue ce ne soit pas le résultat atte ndu par l'utilisate ur (nous avons déjà re ncontré ce ge nre de problèm e dans le paragraph e 1 e n appliq uant m in à des ch aînes7).
Pour l'instant, note z q u'il ne faut pas espé re r am é liore r la situation e n dé finissant un patron supplém e ntaire de la form e :
template <class T> T min (T * a, T * b) { if (*a < *b) return *a ;
else return *b ; }
7 - M ais ce problèm e pourra se régler convenablem ent avec la spécialisation de patron, ce qui n'est pas le cas du problèm e que nous e xposons ici.
XI. Le s patrons de fonctions 183
En e ffe t, les q uatre fam illes de fonctions ne seraie nt alors plus totalem e nt indé pe ndantes. Plus précisém e nt, si les trois prem ie rs appe ls fonctionne nt toujours conve nablem e nt, l'appe l m in (& n, & p) conduit alors à une am biguïté puis q ue deux patrons convie nne nt m ainte nant (ce lui q ue nous ve nons d'introduire e t le pre m ie r).
4.2 Exe m ple s de s urdé finition de patron de fonctions
com portant de s param è tre s e xpre s s ion
R appe lons q ue ce rtaines im plém e ntations autorisent les param è tres expression. D ans ces conditions, la surdéfinition de patron pre nd un caractè re plus général. Dans l'e xe m ple suivant, nous avons défini de ux fam illes de fonctions m in :
• l'une pour dé te rm ine r le m inim um de deux valeurs de m ê m e type q ue lconq ue ,
• l'autre pour dé te rm ine r le m inim um des valeurs d'un tableau de type q ue lconq ue e t de taille q ue lconq ue (fournie e n argum e nt sous form e d'un entie r).
_______________________________________________________________________________ ____
#include <iostream.h> // patron I
template <class T> T min (T a, T b) { if (a < b) return a ;
else return b ; }
// patron II
template <class T> T min (T * t, int n) { int i ;
T min = t[0] ;
for (i=1 ; i<n ; i++) if (t[i] < min) min=t[i] ; return min ;
} main()
{ long n=2, p=12 ;
float t[6] = {2.5, 3.2, 1.5, 3.8, 1.1, 2.8} ;
cout << min (n, p) ; // patron I long min (long, lon) cout << min (t, 6) ; // patron II float min (float *, int) }
_______________________________________________________________________________ ____
Exe m ple de surdéfinition de patrons com portant un param è tre e xpre s s ion
Note z q ue si plusieurs patrons sont susce ptibles d'ê tre e m ployés et q u'ils ne se distingue nt q ue par le type de leurs param è tres expression, ce sont alors les rè gles de ch oix d'une fonction surdéfinie ordinaire q ui s'appliq ue nt.