figurant dans la liste (template). Les paramètres expression doivent obligatoirement être
des expressions constantes du même type que celui figurant dans la liste. Par exemple,
avec notre précédent patron (on suppose que pt est une classe) :
class gene c1 ; // T = int, U = float, n = 5
class gene c2 ; // T = int, U = int, n = 12
const int NV=100 ;
class gene c3 ; // T = pt, U = double, n=100
int n = 5 ;
class gene c4 ; // erreur : n n'est pas constant
const char C = 'e' ;
class gene c5 ; // erreur : C de type char et non int
Un paramètre de type effectif peut lui-même être une classe patron. Par exemple, si
nous avons défini un patron de classes point par :
template class point { ..... } ;
Voici des instances possibles de gene :
class gene , float, 10> c5 ; // T=point, U=float, n=10
class gene , point, 5> c6 ; // T=point, U=point, n=5
Un patron de classes peut comporter des membres (données ou fonctions) statiques ;
dans ce cas, chaque instance de la classe dispose de son propre jeu de membres
statiques.
Spécialisation d’un patron de classes
Un patron de classes ne peut pas être surdéfini (on ne peut pas définir deux patrons de
même nom). En revanche, on peut spécialiser un patron de classes de différentes
manières.
-- En spécialisant une fonction membre
Par exemple, avec ce patron :
template class tableau { ..... } ;
On pourra écrire une version spécialisée de constructeur pour le cas où T est le type
point et où n vaut 10 en procédant ainsi :
tableau :: tableau (...) { ..... }
-- En spécialisant une classe
Dans ce cas, on peut éventuellement spécialiser tout ou une partie des fonctions
membre, mais ce n’est pas nécessaire. Par exemple, avec ce patron :
template class point { ..... } ;
on peut fournir une version spécialisée pour le cas où T est le type char en procédant
312
Précédent

- 313/398

Suivant