Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik yang Dibungkus dalam C ?

Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik yang Dibungkus dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-10-23 18:09:02471semak imbas

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

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:

  • Menggunakan Try/Throw: Lemparkan pengecualian untuk melarikan diri dari gelung. Nota: Pendekatan ini boleh melambatkan fungsi dengan ketara.
  • Pembolehubah/Jika Suis: Gunakan pernyataan suis yang dikawal oleh pembolehubah yang mewakili setiap jenis. Ini tidak sesuai tetapi boleh mengendalikan kenyataan pemulangan/pecah.

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!

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