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

Susan Sarandon
Lepaskan: 2024-10-23 18:09:02
asal
471 orang telah melayarinya

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

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

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!

sumber:php
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!