• Aucun résultat trouvé

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.