Heim > Backend-Entwicklung > C++ > Können Sie Struktur- und Klassenmitglieder in C dynamisch durchlaufen?

Können Sie Struktur- und Klassenmitglieder in C dynamisch durchlaufen?

Susan Sarandon
Freigeben: 2024-10-30 14:11:03
Original
1022 Leute haben es durchsucht

  Can You Dynamically Traverse Struct and Class Members in C  ?

Iterative Untersuchung von Struktur- und Klassenmitgliedern

Ist es in C möglich, eine Struktur oder Klasse zu durchlaufen und alle ihre Mitglieder zu entdecken? Betrachten Sie die folgenden Beispiele:

<code class="cpp">struct a
{
  int a;
  int b;
  int c;
};

class b
{
  public:
    int a;
    int b;
  private:
    int c;
};</code>
Nach dem Login kopieren

Ist es möglich, diese Strukturen zu durchlaufen und Anweisungen wie „Struktur a hat int namens a, b, c“ oder „Klasse b hat int namens a, b, c"?

Lösung

Um dies zu erreichen, können Sie Makros verwenden oder die Struktur als Fusionssequenz anpassen.

Methode 1 : REFLECTABLE-Makro

Definieren Sie die Struktur mit dem REFLECTABLE-Makro wie unten gezeigt:

<code class="cpp">struct A
{
    REFLECTABLE
    (
        (int) a,
        (int) b,
        (int) c
    )
};</code>
Nach dem Login kopieren

Anschließend iterieren Sie über die Felder und drucken jeden Wert aus:

<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 &amp; x)
{
    visit_each(x, print_visitor());
}

A x;
print_fields(x);</code>
Nach dem Login kopieren

Methode 2: Anpassung der Fusionssequenz

Anpassen der Struktur als Fusionssequenz:

<code class="cpp">struct A
{
    int a;
    int b;
    int c;
};

BOOST_FUSION_ADAPT_STRUCT
(
    A,
    (int, a)
    (int, b)
    (int, c)
)</code>
Nach dem Login kopieren

Drucken Sie die Felder mit diesem Ansatz:

<code class="cpp">struct print_visitor
{
    template<class Index, class C>
    void operator()(Index, C &amp; 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 &amp; 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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKönnen Sie Struktur- und Klassenmitglieder in C dynamisch durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage