Exploration itérative des membres de structure et de classe
En C , est-il possible de parcourir une structure ou une classe et de découvrir tous ses membres ? Considérez les exemples suivants :
<code class="cpp">struct a { int a; int b; int c; }; class b { public: int a; int b; private: int c; };</code>
Est-il possible de parcourir ces structures et d'imprimer des instructions telles que "La structure a a un int nommé a, b, c" ou "La classe b a un int nommé a, b, c"?
Solution
Pour y parvenir, vous pouvez utiliser des macros ou adapter la structure comme une séquence de fusion.
Méthode 1 : Macro REFLECTABLE
Définissez la structure à l'aide de la macro REFLECTABLE comme indiqué ci-dessous :
<code class="cpp">struct A { REFLECTABLE ( (int) a, (int) b, (int) c ) };</code>
Ensuite, parcourez les champs et imprimez chaque valeur :
<code class="cpp">struct print_visitor { template<class FieldData> void operator()(FieldData f) { std::cout << f.name() << "=" << f.get() << std::endl; } }; template<class T> void print_fields(T & x) { visit_each(x, print_visitor()); } A x; print_fields(x);</code>
Méthode 2 : Adaptation de la séquence de fusion
Adapter la structure en tant que séquence de fusion :
<code class="cpp">struct A { int a; int b; int c; }; BOOST_FUSION_ADAPT_STRUCT ( A, (int, a) (int, b) (int, c) )</code>
Imprimez les champs en utilisant cette approche :
<code class="cpp">struct print_visitor { template<class Index, class C> void operator()(Index, C & c) { std::cout << boost::fusion::extension::struct_member_name<C, Index::value>::call() << "=" << boost:::fusion::at<Index>(c) << std::endl; } }; template<class C> void print_fields(C & c) { typedef boost::mpl::range_c<int,0, boost::fusion::result_of::size<C>::type::value> range; boost::mpl::for_each<range>(boost::bind<void>(print_visitor(), boost::ref(c), _1)); }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!