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 :

MPL introspection test membre


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut MPL introspection test membre
    HEllo,

    Quelles sont les possiblités d'introspection via boost MPL ?
    On peut obtenir une liste des membes ?
    On peut juste tester l'existence d'un membre en connaissant son nom ?

    Merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Quelles sont les possiblités d'introspection via boost MPL ?
    Aucunes, la MPL n'est pas faites pour ça...

    Enfin si pour être exacte tu peux tester la présence d'un membre nested :
    http://live.boost.org/doc/libs/1_43_...trait-def.html


    C'est récent et ça marche pas sur tout les compilo. Pour faire de l'introspection Joel a quelque chose dans le vault (de boost ofc) il me semble .


    Sinon en général je fais à la mano avec du sizeof trick (SFINAE toussa toussa)

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ok
    c'est quoi tiens ça le "vault" ?
    Joel si tu passes par là , je veux bien que tu m'en dises plus ...

    Merci

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    http://www.boostpro.com/vault/ et pas besoin de Joel, y'a de la doc

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Goten Voir le message
    Aucunes, la MPL n'est pas faites pour ça...

    Enfin si pour être exacte tu peux tester la présence d'un membre nested :
    http://live.boost.org/doc/libs/1_43_...trait-def.html
    .


    Sinon en général je fais à la mano avec du sizeof trick (SFINAE toussa toussa)
    le problème c'est qu'avec SFINAE on ne peut tester que la pérsence d'un typedef

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    le problème c'est qu'avec SFINAE on ne peut tester que la pérsence d'un typedef
    Non, on peu tester la présence d'un membre publique, et le résultat est correct tant qu'il n'existe pas un membre portant le même nom en privé.

    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
     
    template<class T>
    class has_member
    {
    		typedef char size1[1];
    		typedef char size2[2];
     
    		template<void (T::*)()>
    		class wrapper{};
     
    		template<class U>
    		static size1& test(const wrapper<&U::foo>*);
    		template<class U>
    		static size2& test(...);
     
    	public:
    		enum { value = (sizeof(test<T>(NULL)) == sizeof(size1)) };
    };

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Tu peux tester quasiment tout et n'imp avec la SFINAE.
    Ce fichier:
    http://www.boostpro.com/vault/index....39539f7d172538

    definie des macros qui génére des meta-fonctions qui teste si un type donnée supporte un appel de méthode avec un prototype donné.

    Faut que je pense à migrer intospection du vault vers mon github

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    le problème c'est qu'avec SFINAE on ne peut tester que la pérsence d'un typedef

    Non :

    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
    template <int N>
    struct wrapper;
     
    template <typename T>
    struct has_fct_foo
    {
        typedef char yes;
        struct no { char dummy[2];};
     
        template <typename U> static yes tester(wrapper<sizeof(&U::foo)>*);
        template <typename U> static no tester(...);
     
        enum { value = sizeof(tester<T>(0)) == sizeof(yes) };
    };
     
    struct bar { void foo() {} };
    struct baz : bar {};
    struct quux { typedef int foo; };
     
    std::cout << has_fct_foo<bar>::value << std::endl;
    std::cout << has_fct_foo<baz>::value << std::endl;
    std::cout << has_fct_foo<quux>::value << std::endl;
    en sortie :

    1
    1
    0

    Avec un (tout petit) peu plus de travail tu généralises ça à grand coup de macro et tu rajoutes la possibilité de matcher une signature en particulier.
    A mince, c'est ce que fait déjà la bibliothèque d'introspection ...


    (il faut vraiment de la doc sur SFINAE ... si seulement ... )

    edit : oupsie, j'avais pas vu la réponse de Flob90, toute mes confuses.
    edit : ok jetlag de fou ..

  9. #9
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    le truc c'est que pour moi le véritable intérêt dans l'introspection ça serait par exemple d'obtenir la liste des membres avec leur type, hors visiblement c'est impossible

    cela dit boost vault reste très sympa

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/12/2008, 20h03
  2. Réponses: 3
    Dernier message: 07/12/2006, 12h23
  3. [WD9] Test si membre existe
    Par Romanops dans le forum WinDev
    Réponses: 4
    Dernier message: 06/02/2006, 15h20

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