Heim >Backend-Entwicklung >C++ >Wie iteriert man effektiv über gepackte variadische Vorlagenargumentlisten in C?
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: Erweiterter Fold-Ausdruck mit Break/Return Wenn Sie Pausen oder Returns in Ihrer Schleife benötigen, ziehen Sie die folgenden Problemumgehungen in Betracht: 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!<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
([&]
{
std::cout << "input " << ++i << " = " << inputs << std::endl;
} (), ...);
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>
<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
try {
([&]
{
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>
<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
bool exit = false;
auto process_input = [&](auto &&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>