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

Boost C++ Discussion :

boost::mpl? et type_traits?


Sujet :

Boost C++

  1. #1
    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 boost::mpl? et type_traits?
    Bonsoir,
    Je voudrais conditionner des variables suivant des types existants ou non dans une politique. Comme un exemple vaut mieux qu'un long discours, voilà ce que j'ai tenté:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <boost/type_traits.hpp>
    #include <boost/mpl/if.hpp>
    // Premiere politique avec un seul type:
    struct MaPolitique1
    {
       typedef int Type_1;
    };
    // Seconde politique avec deux types:
    struct MaPolitique2
    {
       typedef int Type_1;
       typedef int Type_2;
    };
    // Ma classe:
    template<typename PolitiqueT>
    class A
    {
    public:
    // si la politique contient Type_1, alors je défini un membre Type_1 (sinon un void* en attendant mieux):
       typename boost::mpl::if_<
          boost::is_class<typename PolitiqueT::Type_1>
          ,typename PolitiqueT::Type_1
          ,void*
       >::type m_Membre1;
     
    // si la politique contient Type_2, alors je défini un membre Type_2 (sinon un void* en attendant mieux):
       typename boost::mpl::if_<
          boost::is_class<typename PolitiqueT::Type_2>
          ,typename PolitiqueT::Type_2
          ,void*
       >::type m_Membre2;
    };
     
    int main(void)
    {
       A<MaPolitique1> a1;// bien sûr, ça ne compile pas car MaPolitique1::Type_2 n'existe pas.
       A<MaPolitique2> a2;
       return std::cin.get();
    }
    L'erreur:
    Citation Envoyé par compilateur
    error C2039: 'Type_2' : is not a member of 'MaPolitique1'
    Quelqu'un aurait une idée sur la voie à suivre? Je pense être sur une mauvaise voie, et je ne sais pas trop vers où aller
    Merci

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Salut,

    Comment instancies-tu A ?

    Et sinon, tu as lu http://alp.developpez.com/tutoriels/traitspolicies/#LII ?
    La partie sur la modification de la structure d'une classe hôte.

    Bref, un enable_if devrait faire l'affaire.

  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
    Citation Envoyé par Alp Voir le message
    Salut,

    Comment instancies-tu A ?
    C'est donné dans le bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       A<MaPolitique1> a1;// bien sûr, ça ne compile pas car MaPolitique1::Type_2 n'existe pas.
       A<MaPolitique2> a2;
    Citation Envoyé par Alp Voir le message
    Et sinon, tu as lu http://alp.developpez.com/tutoriels/traitspolicies/#LII ?
    La partie sur la modification de la structure d'une classe hôte.
    Yes, et même plusieurs fois! Cependant, ça ne peut répondre stricto-sensu à mon problème.
    Bref, un enable_if devrait faire l'affaire.
    Idem.

    En fait, je voudrais faire une instance si la politique contient un type et faire une autre instance si elle ne contient pas le type. Donc, je suis obligé de tester l'existence du type et là est le hic. En fait, je crois qu'il faut que j'aborde mon problème autrement car j'ai l'impression que tel quel, ce n'est pas possible.

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je serais d'avis d'essayer de reporter le maximum dans la classe de politique.
    Tu ne pourrais pas en hériter par exemple ? Ca règlerait tout.
    Comme ça, tu récupères les types contenus dans la politique et uniquement ceux-là.

  5. #5
    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
    En fait, mon problème est un peu tordu:
    J'ai une grammaire G (boost::spirit) avec un template pour une politique d'actions PolAcT.
    Ma méthode qui instancie la grammaire est aussi template acT. Celui-ci sert à déterminer quelle politique d'action utilisée pour instancier la grammaire.
    Le choix de la politique d'action PolAcT dépend de l'existance d'un type TypeT dans acT.
    En gros je voudrais faire:
    si act::TypeT existe alors utiliser PolAcT = Politique1<act::TypeT>
    sinon utiliser PolAct = Politique2

    D'où mon besoin de tester si act::TypeT existe dans la politique.

    Je pense à essayer de reformuler mon pb car j'ai le sentiment que je suis parti sur une solution bancale.

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bah ta solution est +/- juste, mais le soucis c'est que le compilateur ne peut que te donner une erreur si t'essayes d'accéder à un type auquel tu ne devrais pas accéder puisque tu as fait en sorte qu'il y ait une erreur de compil si tu y accèdes...

    Donc effectivemenet voir poir ton truc.

    Et si tu héritais de la première politique si il y a TypeT::acT, de la deuxième si non ? Et ce avec un if_ ou quoi, non ?

  7. #7
    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
    Citation Envoyé par Alp Voir le message
    Et si tu héritais de la première politique si il y a TypeT::acT, de la deuxième si non ? Et ce avec un if_ ou quoi, non ?
    C'est pour ça que je pense qu'il faut que je me reprenne ma feuille de papier. Je pense que je dois pouvoir trouver une solution au niveau de la conception.

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bah tu sais, un héritage privé fera l'affaire
    un truc qui serait donc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class empty { };
     
    template <class PolitiqueT>
    class A : typename boost::mpl::if_<
          boost::is_class<typename PolitiqueT::Type>
          , typename PolitiqueT
          , empty
       >::type /* et d'autres héritages si tu veux */
    {
    // ...
    };

  9. #9
    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
    En fait, j'ai résolu mon pb par la conception. J'instancie ma politique d'action un peu plus haut dans ma hierarchie et alors je sais explicitement laquelle prendre. Je pense que j'avais voulu mettre le choix trop bas,d'où le blocage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Boost MPL] Les integral sequence wrappers ?
    Par SalutAVous dans le forum Boost
    Réponses: 6
    Dernier message: 21/12/2012, 14h39
  2. vecteur vide boost::mpl
    Par CedricMocquillon dans le forum Boost
    Réponses: 3
    Dernier message: 05/03/2012, 14h23
  3. Réponses: 10
    Dernier message: 19/09/2011, 14h07
  4. installation de boost
    Par heinquoi dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 18/04/2005, 17h20
  5. cherchecomment utiliser boost sous linux
    Par Krost dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/02/2004, 22h03

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