Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Kami Boleh Mengulangi Senarai Argumen Templat Variadik yang Dikemas Dengan Ringkas?

Bagaimanakah Kami Boleh Mengulangi Senarai Argumen Templat Variadik yang Dikemas Dengan Ringkas?

Linda Hamilton
Lepaskan: 2024-10-24 03:28:30
asal
993 orang telah melayarinya

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

Cara Mengulangi Senarai Argumen Templat Variadik Yang Dikemas

Dalam C , mengulangi senarai argumen templat variadic yang dibungkus menimbulkan cabaran kerana ketidakupayaan untuk mengetahui bilangan hujah dan mendapatkan data daripadanya secara individu. Isu ini ditambah lagi dengan penggunaan makro dalam membina fungsi, yang menghalang panggilan rekursif.

Untuk menangani perkara ini, penyelesaian yang disediakan menggunakan jenis tersuai, mana-mana, yang boleh menyimpan pelbagai jenis data. Dengan menghantar jenis ini kepada templat variadic, hujah dikembangkan menjadi vektor sebarang objek. Selepas itu, elemen individu vektor ini boleh diambil menggunakan fungsi getter khusus (get()), membenarkan lelaran ke atas jenis data yang berbeza.

Walaupun kaedah ini menyelesaikan tugas, ia memerlukan panggilan fungsi verbose, seperti foo(arg(1000)). Untuk memudahkan ini, kami mencari kaedah lelaran yang lebih ringkas atau setara dengan std::get() untuk senarai argumen templat variadic yang dibungkus.

Penyelesaian menggunakan STL Fold Expressions dan Lambda

Untuk C 17 dan lebih baru, ungkapan lipatan boleh digunakan bersama-sama dengan fungsi lambda untuk mencapai lelaran. Lambda boleh melakukan operasi sembarangan dalam gelung, termasuk menambah pembilang dan mencetak hujah semasa:

<code class="cpp">template <class ... Ts>
void Foo (Ts &amp;&amp; ... inputs)
{
    int i = 0;

    ([&amp;]
    {
        // Do things in your &quot;loop&quot; lambda

        ++i;
        std::cout << &quot;input &quot; << i << &quot; = &quot; << inputs << std::endl;

    } (), ...);
}</code>
Salin selepas log masuk

Kaedah ini menyediakan mekanisme lelaran yang lebih ringkas dan boleh dibaca.

Alternatif untuk Menangani Pecah Gelung

Sementara penyelesaian yang dinyatakan di atas menyelesaikan tugas, ia tidak mempunyai keupayaan untuk melaksanakan pemecahan atau pengembalian dalam gelung. Untuk menangani perkara ini, kita boleh menggunakan penyelesaian seperti:

  • Menggunakan cuba/lempar: Dalam pendekatan ini, kita boleh membuang pengecualian dalam lambda untuk keluar dari gelung. Walau bagaimanapun, kaedah ini boleh memberi kesan ketara kepada prestasi disebabkan oleh overhed pengecualian.
  • Pembolehubah/jika Suis: Pendekatan ini melibatkan mencipta pembolehubah untuk mengawal gelung dan menggunakan pernyataan if untuk keluar daripada gelung itu. Walaupun berkesan, ia boleh membawa kepada kod yang kurang menyenangkan dari segi estetika.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mengulangi Senarai Argumen Templat Variadik yang Dikemas Dengan Ringkas?. 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