Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik dengan Berkesan dalam C ?

Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik dengan Berkesan dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-10-23 18:21:59566semak imbas

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

Menyalurkan Senarai Argumen Templat Variadik yang Dikemas

Pengenalan

Templat variadik membolehkan anda mencipta fungsi generik yang boleh mengambil bilangan hujah yang berubah-ubah. Walau bagaimanapun, mengulangi hujah tersebut boleh mencabar. Artikel ini meneroka kaedah untuk mengulangi senarai argumen templat variadic yang dibungkus, termasuk penyelesaian komprehensif menggunakan ungkapan lipatan.

Kaedah 1: Lelaran Atas Input Jenis Homogen

Jika input anda semuanya daripada jenis yang sama, anda boleh menggunakan fungsi makro atau lambda untuk mengulanginya. Contohnya:

<code class="cpp">#include <iostream>

#define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))

Penggunaan:

<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);

Kaedah 2: Ungkapan Lipat (>= C 17)

Untuk campuran- input jenis, ekspresi lipatan menyediakan pendekatan yang ringkas dan berkuasa. Pertimbangkan contoh berikut:

<code class="cpp">#include <iostream>
#include <utility>

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

    ([&amp;]
    {
        std::cout << "input " << ++i << " = " << inputs << std::endl;
    } (), ...);
}

int main()
{
    Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>

Ekspresi Lipatan Dipertingkatkan dengan Putus/Pulangan

Jika anda memerlukan rehat atau pengembalian dalam gelung anda, pertimbangkan penyelesaian berikut:

  • Cuba/Lempar:
<code class="cpp">#include <iostream>
#include <utility>

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

    try {
        ([&amp;]
        {
            std::cout << "input " << ++i << " = " << inputs << std::endl;
            if (inputs == 'a') throw 1;
        } (), ...);
    } catch (...) {
    }
}

int main()
{
    Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>
  • Pembolehubah/Jika Suis:
<code class="cpp">#include <iostream>
#include <utility>

template <class ... Ts>
void Foo (Ts &&... inputs)
{
    int i = 0;
    bool exit = false;

    auto process_input = [&amp;](auto &amp;&amp;input) mutable {
        if (input == 'a') {
            std::cout << "Found 'a'. Breaking loop." << std::endl;
            exit = true;
            return;
        }
        std::cout << "input " << ++i << " = " << input << std::endl;
    };

    (process_input(inputs), ...);
    if (!exit)
        std::cout << "Finished looping through all inputs." << std::endl;
}

int main()
{
    Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik dengan Berkesan 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