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 :

[C++] Enumeration de classes


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    8
    D�tails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 8
    Par d�faut [C++] Enumeration de classes
    Bonjour � tous,

    Je suis face � un petit probl�me de conception : je cherche � savoir s'il est possible d'�numer des types. Afin d'etre plus clair je vous donne mon code et je vous expose mon probl�me ensuite.

    Compilateur: GCC
    Environment: Code::Blocks v1


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    NB: le code de la classe Interf_Register ne pose pas de probl�me ici: c'est juste une interface classique (je les notes par Interf_X ou X est le nom de la classe a interfacer).
    
    
    template <class INTERF_TYPE , class CONTENEUR_TYPE = std::vector<INTERF_TYPE *> >
    class Register : public Interf_Register, public CONTENEUR_TYPE
    {
    public:
        virtual std::string GetInfo_Summary(void);
    
    public:
        void Add (INTERF_TYPE* ToReg) {push_back(ToReg);}
        int GetSize(void) {return (int) size();}
    };
    
    template <class INTERF_TYPE, class CONTENEUR_TYPE>
    std::string Register<INTERF_TYPE,CONTENEUR_TYPE>::GetInfo_Summary(void)
    {
        std::ostringstream oss;
        oss << "Registre: " << GetName() << " ; Contenu: " << GetSize() << " elements.\n";
        return oss.str();
    }
    
    
    QQ exemples d'application de ma classe pr�c�dente:
    
    typedef Register<Interf_Toto> Register_Toto;
    
    typedef Register<Interf_Amination, std::deque<Interf_Amination*> > Register_Animation;
    Le probl�me r�side dans l'appel de la m�thode size() contenu dans la methode GetSize() : size() est une m�thode g�n�rique sur les conteneurs de la stl et le compilateur (gcc) refuse ce code car il d�pend d'un template . Je pourrais lever ce probl�me en mettant le compilateur en mode permissif, mais j'aimerai �viter cela et garder en template le type de conteneur pour pouvoir facilement le changer plus tard (ad hoc).

    En fait, je voudrais restrindre le choix de l'argument template "class CONTENEUR_TYPE" � une liste de conteneurs donn�s afin de rendre plus propre ce code et ca je ne sais pas faire... J'aurai besoin de vos suggestions et de votre exp�rience... SVP!!!

    Peut-on faire une liste de classes � la mani�re d'une enum (j'y connais presque rien en enum)?



    j'aurais aim� avoir un truc du style:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class interface>
    enum MesConteneurQuiMArchent
    {
    std::vector<interface>,
    std::deque<interface>,...
    };  
     
    et pour les template de la class Register:
     
    template <class INTERF_TYPE , class MesConteneurQuiMArchent<INTERF_TYPE *> CONTENEUR_TYPE = std::vector<INTERF_TYPE *> >
    ... mais c'est sans doute completement foireux... Auriez vous d'autre id�es pour faire restreidre cet argument template?


    En esp�rant avoir �t� assez clair, et merci d'avance pour votre aide




    Dalo

  2. #2
    Membre �clair� Avatar de vdumont
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    510
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 510
    Par d�faut
    � moins que je fasse erreur, il me semble que enum sert � faire une collection d'entiers constants donc je ne crois pas que tu peux appliquer cel� aux conteneurs de la STL.

    Deuxi�ment, � moins que je fasse erreur, il fait plus ou moins de sens qu'il y ait un appel � la m�thode size() sans rien autour de l'os. (Est-ce que tu sous-entends this->?) Normalement on verrait quelque chose du type monConteneur.size() ou alors sizeof(type). Mais size() simplement?

  3. #3
    Membre chevronn�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par d�faut
    Citation Envoy� par Dalo
    je cherche � savoir s'il est possible d'�numer des types.
    C'est possible, regarde les typelists d'Alexandrescu.

    Citation Envoy� par Dalo
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     
    template <class INTERF_TYPE , class CONTENEUR_TYPE = std::vector<INTERF_TYPE *> >
    class Register : public Interf_Register, public CONTENEUR_TYPE
    {
    };
    Ce n'est en general pas une bonne idee de deriver des conteneurs de la SL : ils n'ont pas ete prevus pour ca (notamment, ils n'ont pas de destructeur virtuel).

    Citation Envoy� par Dalo
    Le probl�me r�side dans l'appel de la m�thode size() contenu dans la methode GetSize() : size() est une m�thode g�n�rique sur les conteneurs de la stl et le compilateur (gcc) refuse ce code car il d�pend d'un template.
    this->size() devrait resoudre ce probleme. Sinon, tu peux aussi ecrire CONTENEUR_TYPE::size().

    Citation Envoy� par Dalo
    En fait, je voudrais restrindre le choix de l'argument template "class CONTENEUR_TYPE" � une liste de conteneurs donn�s
    Ce n'est pas possible avec un enum : un enum cree des litteraux ayant des valeurs entieres, pas des alias sur des types. En utilisant boost, tu peux arriver a une solution en utilisant boost::is_same et BOOST_STATIC_ASSERT.

  4. #4
    Membre �clair� Avatar de vdumont
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    510
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 510
    Par d�faut
    Tu te d�brouilles pas mal en fran�ais pour un am�ricain roulious

  5. #5
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    8
    D�tails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 8
    Par d�faut
    Merci beaucoup pour vos r�ponses.

    Je ne savais pas que deriver des conteneurs de la SL �tait un mauvais choix; merci pour cette pr�cision roulious.

    Pour mon code je pense que je vais quand meme garder cette d�rivation des conteneurs car mes classes filles sont juste des conteneurs avec quelques petites methodes de traitement (vraiment rien de m�chant).

    Encore merci pour tes explications roulious.

    Dalo

  6. #6
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Par contre, l'une des solutions qui *pourrait* convenir, serait de cr�er une �num�ration sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    enum TYPENAME{TYPE1,TYPE2,TYPE3(...)};
    de rajouter un membre sous la forme de
    qui prendrait comme valeur, fatalement, TYPE1,TYPE2 ou TYPE3 selon le type r�el, et, dans ta m�thode size(), utiliser un switch sur cette valeur sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    switch (LeTypeReel)
    {
        case TYPE1:
            return sizeof(Type1);
            break;
        case TYPE2:
            return sizeof(Type3);
            break;
    (...)
    }
    Evidemment, encore faut il que ce code s'adapte � ta situation propre...

    Une autre solution, qui ne passe pas par une �num�ration proprement dite, serait d'attaquer la recherche du contenu sous la forme de typeid et de son penchant type_info() (n�cessite un #include<typeinfo>)

    Sauf erreur de ma part, meme dans une classe mod�le, tu devrais etre en mesure de r�cup�rer le type d'origine d'un objet quelconque...

    Tu pourrais donc envisager un code du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    const type_info &info=typeid(membre);
    //récupération du nom
    std::string nomtype.assing(info.what());
    //certains compilateur mettent des numéros avant les noms de types, 
    // supprimons les ;)
    nomtype=substr(nomtype.find_first_not_of("0123456789"),nomtype.size());
    // y a plus qua tester nomtype
     
    if(nomtype=="Type1")
    {
     
    }
    else if(nomtype=="Type2")
    {
     
    }
    (...)
    Penses � prendre "l'�l�ment point� par" quand tu utilises typeid() sur un pointeur

    NOTA: il y a peut etre des solutions plus jolies... � toi d'y regarder de plus pr�s;-)
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  7. #7
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Roulious a donn� la solution la plus efficace => les typelists d'Andrei Alexandrescu (-> Modern C++ Design, Addisson-Wesley ; loki, sur sourceforge)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Classe pour la cr�ation d'un graphe xy
    Par Bob dans le forum MFC
    R�ponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Enumération ou classe
    Par nathieb dans le forum Diagrammes de Classes
    R�ponses: 6
    Dernier message: 25/10/2006, 19h26
  3. R�ponses: 31
    Dernier message: 30/03/2006, 16h57
  4. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et ant�rieur
    R�ponses: 7
    Dernier message: 04/05/2004, 18h34
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    R�ponses: 13
    Dernier message: 03/07/2002, 17h21

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