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++

  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 : 34
    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

  11. #11
    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
    Y a moyen en passant par boost::fusion et BOOSt_FUSION_ADAPT_STRUCT

  12. #12
    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 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
    Regarde du côté de CAMP alors. (réflexion / introspection). Mais ton sujet était trompeur, (MPL etc, je pensais à valider des interfaces / concept)

  13. #13
    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 : 34
    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
    Vouloir obtenir la listes de tout les membre d'une classe de manière non intruisive et sans rentrées des information à la compilation ne me semble pas possible :

    - Avec du SFINAE, tu pourras tester la présence de tel ou tel chose
    - Avec CAMP, tu pourras manipuler des objets à l'execution directement, mais ca suppose que tu ais donné à CAMP les informations dont il a besoin sur tes types (il ne vas pas deviner tous seul).

    Les outils qui permettent ca serait plûtot des outils d'analyse de code, mais ca n'est pas directement lié au langage.

    CAMP et SFINAE répondent à deux problèmatiques distinctes.

  14. #14
    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
    Je répéte : Boost::Fusion

  15. #15
    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 : 34
    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
    @Joel: Si j'ai bien compris boost::fusion ne permet pas de découvrir tous les membres d'une classes à la compilation, il faut lui indiquer quoi chercher, enfin c'est ce que je comprend avec les exemples du moins.

  16. #16
    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
    c'est quoi cette syntaxe ??
    template<void (T::*)()/>

    faute de frappe j'imagine

  17. #17
    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 : 34
    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
    Non, c'est juste que le paramètre template sera un pointeur sur une fonction de la classe T ne prenant aucun paramètres ne retournant rien. (Tu aurais pu tester)

  18. #18
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par Flob90 Voir le message
    Non, c'est juste que le paramètre template sera un pointeur sur une fonction de la classe T ne prenant aucun paramètres ne retournant rien.
    Je pense qu'il voulait parler du / qui est bien une faute de frappe.

    MAT.

  19. #19
    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 : 34
    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
    Ha oui pardon. (C'est un copié/coller et j'avais mis le commentaire /*todo*/ pour me souvenir de modifier les paramètre/retour au besoin). Je corrige

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