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

Mary-Kate Olsen
Lepaskan: 2024-10-28 03:02:31
asal
669 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!