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:
Verwenden 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:
struct A
{
REFLECTABLE
(
(int) a,
(int) b,
(int) c
)
};
Sobald die Struktur definiert ist, können Sie eine Besucherfunktion verwenden, um über ihre Mitglieder zu iterieren und deren Namen und Werte auszugeben:
struct print_visitor
{
template
void operator()(FieldData f)
{
std::cout
void print_fields(T & x)
{
visit_each(x, print_visitor());
}
A x;
print_fields(x);
Anpassen von Strukturen 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:
struct A
{
int a;
int b;
int c;
};
BOOST_FUSION_ADAPT_STRUCT
(
A,
(int, a)
(int, b)
(int, c)
)
Sobald die Struktur angepasst ist, können Sie eine Bereichsschleife verwenden, um die Mitglieder zu durchlaufen und ihre Namen und Werte auszugeben:
struct print_visitor
{
template
void operator()(Index, C & c)
{
std::cout ::call()
(c)
void print_fields(C & c)
{
typedef boost::mpl::range_c::type::value> range;
boost::mpl::for_each(boost::bind(print_visitor(), boost::ref(c), _1));
}
Mit beiden Ansätzen können Sie Strukturen und Klassen introspizieren und zur Laufzeit auf ihre Mitglieder und Werte zugreifen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3