Bagaimanakah anda boleh mengulangi dan mencetak nilai ahli struktur dalam C menggunakan perpustakaan makro dan Fusion?

DDD
Lepaskan: 2024-10-28 08:25:02
asal
221 orang telah melayarinya

How can you iterate through and print the values of structure members in C   using macros and Fusion libraries?

Lelaran melalui Struktur dan Ahli Kelas

C menyediakan cara untuk lelaran melalui ahli struct dan kelas untuk memudahkan introspeksi dan manipulasi sifat mereka.

Menggunakan Makro

Makro REFLECTABLE yang ditakrifkan dalam jawapan yang diterima membolehkan definisi struct yang boleh mendedahkan ahlinya untuk introspeksi. Dengan menambahkan REFLECTABLE sebelum pengisytiharan ahli, anda boleh mentakrifkan struct seperti:

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

Untuk mengulang dan mencetak nilai ahli ini, anda boleh menggunakan pelawat tersuai:

<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());
}</code>
Salin selepas log masuk

Menggunakan Fusion

Sebagai alternatif, anda boleh menyesuaikan struct kepada jujukan gabungan menggunakan BOOST_FUSION_ADAPT_STRUCT:

<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

Untuk mengulang dan mencetak ahli, anda boleh menggunakan fungsi pelawat yang serupa:

<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

Atas ialah kandungan terperinci Bagaimanakah anda boleh mengulangi dan mencetak nilai ahli struktur dalam C menggunakan perpustakaan makro dan Fusion?. 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
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!