„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich Struktur- und Klassenmitglieder in C++ durchlaufen, um zur Laufzeit auf deren Namen und Werte zuzugreifen?

Wie kann ich Struktur- und Klassenmitglieder in C++ durchlaufen, um zur Laufzeit auf deren Namen und Werte zuzugreifen?

Veröffentlicht am 06.11.2024
Durchsuche:330

How can I iterate over struct and class members in C   to access their names and values at runtime?

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.

Neuestes Tutorial Mehr>

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