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

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

Susan Sarandon
Susan SarandonOriginal
2024-10-30 14:11:03977Durchsuche

  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>

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>

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>

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>

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>

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!

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