IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Specialisation de template


Sujet :

Langage C++

  1. #1
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut Specialisation de template
    Bonjour,

    Je me demande où, idéalement, se place le code de spécialisation d'une classe template.
    Voyons un exemple. J'ai une classe template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Fichier ClasseBidule.h
    template<class T>
    class Bidule {
        void uneFonction(void);
        T t;
    };
     
    template<class T>
    void uneFonction(void) {
        // du code générique ici
    }
    et une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Fichier ClasseA.h
    class A {
        // des machins
    };
    Je souhaite spécialiser la méthode uneFonction<A>(void).
    • Le fichier ClasseBidule.h général ne connaît pas (et à mon avis, n'a pas à connaître) la classe A.
    • De même, le fichier ClasseA.h ne devrait pas include d'office la définition de la classe Bidule, si par exemple l'utilisation des deux classes et rare.
    • Mettre la spécialisation dans un fichier à part demande à l'utilisateur d'être au courant qu'il y a un cas spécial, qui sera donc probablement oublié.
    • Une inclusion conditionnelle dans ClasseA.h si la classe Bidule existe pose le problème de l'ordre d'inclusion des fichiers d'en-tête

    Au final, le mieux auquel je pense est une inclusion conditionnelle d'un troisième fichier ClasseBidulePourA.hpp dans les 2 fichiers ClasseA.h et ClasseBidule.h.
    Il reste comme petit problème le fait que la maintenance de ces deux fichiers est maintenant reliée (si je change le #define indiquant que ClasseA.h est inclu, je doit penser à mettre à jour ClasseBidule.h, et vice versa). Cela reste un moindre mal.

    Connaissez vous d'autres/de meilleurs moyens pour faire cela ?

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je le mets dans ClassA.h

    Ce n'est pas grave, quand on utilise classA, d'avoir "en plus" la déclaration du template classBidule. Au pire, ça ralentira un peu la compilation, on n'est pas à ça près.

    Par contre, pouvoir utiliser la forme non spécialisée juste par erreur, ça ça me semble une grosse connerie.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'aurais tendance à dire que tu met ta spécialisation dans ClasseBidulePourA.hpp qui inclue A et Bidule mais pas inversement. Ta spécialisation est une troisième classe à part entière. A et Bidule ne doivent pas dépendre de Bidule<A>.

    C'est un peu comme quand tu dérives B de A. B inclut A pour faire l'héritage, mais A n'inclut pas B, car on ne se soucie pas de savoir qui dérive de A.

    Après c'est une question de documentation du projet (document de conception) de savoir que ClasseBidulePourA est la spécialisation de Bidule pour A.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Avec des noms comme A et bidule, je n'ai absolument aucune idee. Je vais parfois mettre la specialisation explicite avec A (par exemple quand je specialise std::swap). Je vais parfois mettre des specialisations avec le template (par exemple quand je specialise pour les types de bases). Bien sur mes exemples sont extremes et je comprends que dans certains cas on se pose la question.

    Je suis contre les definitions conditionnelles, donc je ne vais jamais definir uniquement si un autre entete a deja ete inclus.

    En passant, tu n'as pas besoin de definir le template pour le specialiser, uniquement de le declarer.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/04/2012, 13h53
  2. specialisation de template
    Par jfouche dans le forum Langage
    Réponses: 7
    Dernier message: 11/01/2011, 17h27
  3. specialisation de template
    Par camboui dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2009, 14h16
  4. specialisation de fonction template
    Par chubinou dans le forum Langage
    Réponses: 8
    Dernier message: 13/11/2007, 14h03
  5. Réponses: 5
    Dernier message: 29/12/2005, 21h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo