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
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
Aucunes, la MPL n'est pas faites pour ça...Quelles sont les possiblités d'introspection via boost MPL ?
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)
ok
c'est quoi tiens ça le "vault" ?
Joel si tu passes par là , je veux bien que tu m'en dises plus ...
Merci
http://www.boostpro.com/vault/ et pas besoin de Joel, y'a de la doc![]()
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)) }; };
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
Non :
en sortie :
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;
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 ..![]()
http://github.com/jfalcou/boosties/t...introspection/
pour introspection hors vault
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
Y a moyen en passant par boost::fusion et BOOSt_FUSION_ADAPT_STRUCT
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.
Je répéte : Boost::Fusion
@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.
c'est quoi cette syntaxe ??
template<void (T::*)()/>
faute de frappe j'imagine
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)
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![]()
Partager