Utilisation des listes génériques à type fiable dans les templates

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Présentation des templates de classes - Index

En général, si vous avez besoin d'écrire un grand nombre d'expressions identiques, pensez aux templates. Avec la définition de classe ci-dessous (classe de liste générique),



 class GList
 {
  public:
    void insert( void * );
    void *peek();
     .
     .
     .
 };



Les types de listes ne sont pas fiables et les définitions de classe doivent être répétées pour les solutions standard. Comme les types des expressions insérées ne sont pas contrôlées, vous ne pouvez pas savoir ce que vous allez obtenir. Pour résoudre ce problème, vous pouvez écrire une classe "en boucle" :



 class FooList : public GList {
  public:
    void insert( Foo *f ) { GList::insert( f ); }
    Foo *peek() { return (Foo *)GList::peek(); }
       .
       .
       .
 };



Le type sera fiable. insert prend uniquement des arguments du type pointeur sur Foo ou objet dérivé de Foo. Le conteneur sous-jacent contiendra donc uniquement des pointeurs désignant quelque chose de type Foo. Cela signifie que le transtypage FooList::peek() est toujours fiable et que vous avez généré une vraie FooList. Pour procéder de même pour une BarList, BazList, etc., vous devez répéter les définitions de classe séparément. Pour résoudre le problème des définitions de classe répétées et pour que le type soit fiable, utilisez encore les templates. Voir l'exemple de classe de liste générique à type fiable. La STL (Standard Template Library) C++ propose un riche ensemble de classes collection à type fiable.

En utilisant des templates, vous pouvez construire toutes les listes à type fiable que vous souhaitez avec une simple déclaration. En outre, ces conversions de type ne génèrent pas de code ; aucun temps d'exécution n'est donc imposé par la fiabilité du type.