Maison >développement back-end >C++ >Comment itérer efficacement sur des listes d'arguments de modèles variadiques compressés en C ?
Introduction
Les modèles variadiques vous permettent de créer des fonctions génériques qui peuvent prendre un nombre variable d'arguments. Cependant, parcourir ces arguments peut être difficile. Cet article explore les méthodes d'itération sur des listes d'arguments de modèles variadiques compressées, y compris une solution complète utilisant des expressions de repli.
Méthode 1 : Itérer sur des entrées de type homogène
Si vos entrées sont tous du même type, vous pouvez utiliser une macro ou une fonction lambda pour les parcourir. Par exemple :
<code class="cpp">#include <iostream> #define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))
Utilisation :
<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);
Méthode 2 : Plier les expressions (>= C 17) Pour les tapez les entrées, les expressions de pliage offrent une approche concise et puissante. Prenons l'exemple suivant : Expression de pliage améliorée avec pause/retour Si vous avez besoin de pauses ou de retours dans votre boucle, envisagez les solutions de contournement suivantes : Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!<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>