Maison > développement back-end > C++ > 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
Libérer: 2024-10-23 18:21:59
original
561 Les gens l'ont consulté

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))
Copier après la connexion

Utilisation :

<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
  • 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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal