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

C++ Discussion :

Dériver un patron de classe à partir du patron ?


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Dériver un patron de classe à partir du patron ?
    Voici ce que je veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class A, class B>
    class C : protected A<B>
    {
    ...
    };
    ce qui ne marche pas avec gcc. (v 3.4)

    En pratique A est un patron de classe qui sert de container et B un type de base (char, float, ...)

    Si j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class A, class B>
    class C : protected A
    {
    ...
    };
    Rien ne me dit qu'un utilisateur inattentif ne fera pas
    C c<A<char>, float>;
    par exemple...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    La question est mal formulée : je voudrais pouvoir
    utiliser n'importe quel container pour dériver C.

    Les containers dérivent tous d'une classe Abase et possèdent la
    même interface.

    actuellement ce qui est implémenté est le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class B>
    class C : protected A<B>
    {
    ...
    }
    comment ne pas faire dériver ce patron de classe de la classe A mais
    de n'importe quel descendant de la classe Abase ?


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour les compilos ne supportant pas les templates templates, il n'y a guère mieux que ce que tu proposes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class A, class B>
    class C : protected A
    { };
     
    C c<A<char>, char>;
    Tu pourrais aussi (à la manière des conteneurs standards avec value_type) prévoir dans ABase une manière de récupérer le type de donnée stockée, ainsi tu n'as pas à le repasser lorsque instancies C et tu évites la redondance.

    Mais heureusement pour les compilos récents tu peux faire ce que tu souhaites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <template <class> class A, class B>
    class C : protected A<B>
    { };
     
    C c<A, char>;

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci de ta réponse,

    Je ne suis pas familier avec cette syntaxe.
    Où puis je trouver de la doc et une intro sur cette manière de programmer.

    (à part l'article de Loulou sur ce site) ?

    Merci

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait pour ce qui est de la syntaxe ce n'est pas si compliqué, il suffit de garder en tête que les paramètres templates font partie du "type" de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Classe template quelconque
    template <int I, class T, size_t S>
    class Bop {};
     
    // Classe template pouvant recevoir Bop en paramètre
    template <template <int, class, size_t> class A>
    class Plouf : public A<5, float, 6> {};
     
    // Pour aller à l'extrême : classe template pouvant recevoir Plouf en paramètre (jamais testé, mais bon)
    template <template <template <int, class, size_t> class> class A>
    class Meuh : public Plouf<Bop> {};
    Je ne connais pas de cours sur ce genre de syntaxe poussée sur les templates. Mon tuto sur la meta-prog ne rentre pas en détail dans la syntaxe des templates templates, mais pour le reste ça peut être un bon point de départ si cela t'interesse

Discussions similaires

  1. Patron de classe et identification du type du parametre
    Par frankgoestohollywood dans le forum Langage
    Réponses: 1
    Dernier message: 17/01/2011, 18h09
  2. Réponses: 12
    Dernier message: 29/10/2008, 08h40
  3. Réponses: 4
    Dernier message: 27/10/2008, 17h53
  4. [Template] Patron de classe
    Par houcem001 dans le forum C++
    Réponses: 8
    Dernier message: 27/10/2008, 14h29
  5. patron de classe
    Par Azharis dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2005, 07h17

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