Iterieren über Struktur- und Klassenmitglieder
In C ist es möglich, durch die Mitglieder einer Struktur oder Klasse zu iterieren, um deren Namen abzurufen und Werte. Hier sind einige Ansätze, um dies zu erreichen:
Verwendung von Makros
Das REFLECTABLE-Makro kann verwendet werden, um Strukturen zu definieren, die Selbstbeobachtung ermöglichen. Das Makro definiert die Mitglieder der Struktur als durch Kommas getrennte Liste von Typ-Namen-Paaren. Zum Beispiel:
<code class="cpp">struct A { REFLECTABLE ( (int) a, (int) b, (int) c ) };</code>
Sobald die Struktur definiert ist, können Sie eine Besucherfunktion verwenden, um über ihre Mitglieder zu iterieren und deren Namen und Werte auszugeben:
<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>
Strukturen anpassen als Fusionssequenzen
Ein anderer Ansatz besteht darin, die Struktur als Fusionssequenz mithilfe des Makros BOOST_FUSION_ADAPT_STRUCT anzupassen. Dieses Makro definiert die Strukturmitglieder als eine Folge von Elementen mit dem entsprechenden Typ und Wert. Zum Beispiel:
<code class="cpp">struct A { int a; int b; int c; }; BOOST_FUSION_ADAPT_STRUCT ( A, (int, a) (int, b) (int, c) )</code>
Sobald die Struktur angepasst ist, können Sie eine Bereichsschleife verwenden, um die Mitglieder zu durchlaufen und ihre Namen und Werte auszugeben:
<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>
Beide Ansätze ermöglichen es Ihnen um Strukturen und Klassen zu introspizieren und zur Laufzeit Zugriff auf ihre Mitglieder und Werte zu gewähren.
Das obige ist der detaillierte Inhalt vonWie kann ich Struktur- und Klassenmitglieder in C durchlaufen, um zur Laufzeit auf deren Namen und Werte zuzugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!