Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengulangi struct dan ahli kelas dalam C untuk mengakses nama dan nilai mereka semasa runtime?

Bagaimanakah saya boleh mengulangi struct dan ahli kelas dalam C untuk mengakses nama dan nilai mereka semasa runtime?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-28 03:02:31670semak imbas

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

Lelaran Atas Struktur dan Ahli Kelas

Dalam C , adalah mungkin untuk melelaran melalui ahli struct atau kelas untuk mendapatkan semula nama mereka dan nilai. Berikut ialah beberapa pendekatan untuk mencapai matlamat ini:

Menggunakan Makro

Makro BOLEH DIPANULKAN boleh digunakan untuk mentakrifkan struktur yang membenarkan introspeksi. Makro mentakrifkan ahli struct sebagai senarai pasangan nama jenis yang dipisahkan koma. Contohnya:

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

Setelah struct ditakrifkan, anda boleh menggunakan fungsi pelawat untuk mengulangi ahlinya dan mencetak nama dan nilai mereka:

<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>

Menyesuaikan Struktur sebagai Jujukan Gabungan

Pendekatan lain ialah menyesuaikan struct sebagai jujukan gabungan menggunakan makro BOOST_FUSION_ADAPT_STRUCT. Makro ini mentakrifkan ahli struct sebagai jujukan elemen dengan jenis dan nilai yang sepadan. Sebagai contoh:

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

BOOST_FUSION_ADAPT_STRUCT
(
    A,
    (int, a)
    (int, b)
    (int, c)
)</code>

Setelah struct disesuaikan, anda boleh menggunakan gelung julat untuk mengulangi ahli dan mencetak nama dan nilai mereka:

<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>

Kedua-dua pendekatan ini membolehkan anda untuk introspeksi struct dan kelas, menyediakan akses kepada ahli mereka dan nilai mereka semasa runtime.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengulangi struct dan ahli kelas dalam C untuk mengakses nama dan nilai mereka semasa runtime?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn