Lelaran Atas Senarai Argumen Templat Variadik Yang Dikemas
Dalam C , mengulangi senarai argumen templat variadic yang dibungkus menimbulkan cabaran khusus kerana kekurangan kebolehan refleksi masa kompilasi. Walau bagaimanapun, terdapat teknik yang membolehkan kami menangani tugas ini.
Memahami Masalah
Matlamatnya adalah untuk mengulangi pek hujah templat, mengekstrak data khusus jenis (cth., int, char*, float) dan menyimpannya dalam vektor yang berasingan. Selain itu, vektor diperlukan untuk menjejaki susunan hujah yang muncul.
Mendekati Penyelesaian
Menggunakan Ungkapan Lipat dengan Lambda:
Untuk input jenis campuran, ungkapan C 17 lipatan boleh digunakan bersama ekspresi lambda. Lambda merangkum gelagat gelung, menambah pembilang dan mencetak setiap nilai input bersama-sama dengan kedudukannya.
<code class="cpp">template<class ... Ts> void Foo(Ts && ... inputs) { int i = 0; ([&]() { ++i; std::cout << "input " << i << " = " << inputs << std::endl; }(), ...); }
Mengendalikan Penyata Pulangan/Pecah:
Jika kembali atau penyataan break diperlukan dalam gelung, penyelesaian boleh dilaksanakan:
Pendekatan Makro Tersuai:
Pendekatan alternatif melibatkan penciptaan makro tersuai yang membina jenis untuk tahan semua hujah dan kemudian kembangkannya di dalam vektor. Walaupun ini adalah kaedah bukan standard, ia boleh mencapai kefungsian yang diingini.
<code class="cpp">struct any { void do_i(int e) { INT = e; } void do_f(float e) { FLOAT = e; } void do_s(char* e) { STRING = e; } int INT; float FLOAT; char* STRING; }; #define def(name) \ template<typename... T> \ auto name(T... argv) -> any { \ std::initializer_list<any> argin = { argv... }; \ std::vector<any> args = argin; #define get(name, T) get<T>()(args[name]) #define end }</code>
Pendekatan ini memerlukan memanggil fungsi arg() secara manual untuk mencipta sebarang kejadian bagi setiap hujah.
Kesimpulan
Mengulangi senarai argumen templat variadic yang padat dalam C memerlukan penyelesaian yang inovatif. Pendekatan yang dibincangkan di sini menangani cabaran ini, membenarkan pengendalian yang cekap bagi argumen jenis campuran sambil mengekalkan kemudahalihan dan keserasian merentas platform.
Atas ialah kandungan terperinci Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik yang Dibungkus dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!