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!