Itération à travers les membres de structure et de classe
C fournit divers mécanismes pour parcourir les membres des structures et des classes. Pour y parvenir, vous pouvez utiliser plusieurs techniques.
Définir la structure avec une macro :
Une approche consiste à utiliser la macro REFLECTABLE, comme le montre l'exemple suivant. :
<code class="cpp">struct A { REFLECTABLE ( (int) a, (int) b, (int) c ) };</code>
En utilisant cette macro, vous pouvez facilement parcourir les champs et imprimer leurs valeurs comme suit :
<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>
Adapter la structure en tant que séquence de fusion :
Une autre option consiste à adapter la structure en tant que séquence Boost.Fusion. Prenons l'exemple suivant :
<code class="cpp">struct A { int a; int b; int c; }; BOOST_FUSION_ADAPT_STRUCT ( A, (int, a) (int, b) (int, c) )</code>
Avec cette adaptation, vous pouvez parcourir les champs en utilisant le code suivant :
<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>
Ces techniques vous permettent de parcourir efficacement les membres de la structure et de la classe. en C.
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!