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
Partager