Heim  >  Artikel  >  Backend-Entwicklung  >  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?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 03:02:31670Durchsuche

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:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn