Heim >Backend-Entwicklung >C++ >Wie iteriert man effektiv über gepackte variadische Vorlagenargumentlisten in C?

Wie iteriert man effektiv über gepackte variadische Vorlagenargumentlisten in C?

Barbara Streisand
Barbara StreisandOriginal
2024-10-23 18:21:59563Durchsuche

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

Iterieren über gepackte variadische Vorlagenargumentlisten

Einführung

Mit variadischen Vorlagen können Sie generische Funktionen erstellen, die eine Zeit lang dauern können Variable Anzahl von Argumenten. Es kann jedoch eine Herausforderung sein, diese Argumente zu wiederholen. In diesem Artikel werden Methoden zum Iterieren über gepackte variadische Vorlagenargumentlisten untersucht, einschließlich einer umfassenden Lösung mithilfe von Faltausdrücken.

Methode 1: Iterieren Sie über Eingaben homogener Typen

Wenn Ihre Eingaben Da alle vom gleichen Typ sind, können Sie sie mit einem Makro oder einer Lambda-Funktion durchlaufen. Zum Beispiel:

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

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

Verwendung:

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

Methode 2: Ausdrücke falten (>= C 17)

Für gemischte Typeingaben und Faltausdrücke bieten einen prägnanten und leistungsstarken Ansatz. Betrachten Sie das folgende Beispiel:

<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>

Erweiterter Fold-Ausdruck mit Break/Return

Wenn Sie Pausen oder Returns in Ihrer Schleife benötigen, ziehen Sie die folgenden Problemumgehungen in Betracht:

  • Versuchen/Werfen:
<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>
  • Variable/If-Schalter:
<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>

Das obige ist der detaillierte Inhalt vonWie iteriert man effektiv über gepackte variadische Vorlagenargumentlisten in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn