Maison  >  Article  >  développement back-end  >  Comment itérer efficacement sur des listes d'arguments de modèles variadiques compressés en C ?

Comment itérer efficacement sur des listes d'arguments de modèles variadiques compressés en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-23 18:21:59483parcourir

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

Itération sur des listes d'arguments de modèles variadiques compressés

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 :

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

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 :

  • Essayer/Lancer :
<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>
  • Commutateurs variables/si :
<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>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn