Maison > développement back-end > C++ > Comment puis-je parcourir un pack de paramètres en C à l'aide de l'extension de pack ?

Comment puis-je parcourir un pack de paramètres en C à l'aide de l'extension de pack ?

Mary-Kate Olsen
Libérer: 2024-12-24 10:59:13
original
457 Les gens l'ont consulté

How Can I Iterate Over a Parameter Pack in C   Using Pack Expansion?

Modèles variadiques : démêler l'extension du pack pour l'itération

Les modèles variadiques offrent une expressivité remarquable en C, mais s'aventurer dans leur domaine peut révéler des complexités imprévues. L’un de ces défis survient lorsque l’on tente de parcourir un pack de paramètres à l’aide de l’extension de pack. Considérez le code suivant :

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}
Copier après la connexion

Lors de la compilation, ce code rencontre une erreur : "'args' : le pack de paramètres doit être développé dans ce contexte." Le problème vient de l'incapacité d'étendre directement un pack de paramètres dans un appel de fonction.

La solution réside dans l'utilisation de l'expansion du pack dans une liste d'initialisation entre accolades, un contexte qui permet explicitement une telle expansion. En plaçant l'expansion dans la liste d'initialisation d'un tableau factice, nous pouvons forcer le comportement souhaité :

template<typename... Args>
static void foo2(Args &amp;&amp;... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}
Copier après la connexion

Ce code révisé adopte une approche méticuleuse pour garantir une évaluation correcte :

  • Garder contre l'expansion vide : Un Args vide entraînera un tableau de longueur 0, ce qui est illégal en C . Pour éviter cela, nous nous assurons que le tableau contient au moins un élément.
  • Transfert parfait : Nous utilisons le transfert parfait (std::forward) pour éviter les copies potentielles et préserver les qualificatifs potentiellement const.
  • Neutraliser le type de retour : Nous transformons la valeur de retour de bar() en void pour exploiter l'opérateur virgule intégré, garantissant évaluation de gauche à droite.

En C 17, les expressions de pliage offrent une solution encore plus compacte :

((void) bar(std::forward<Args>(args)), ...);
```

This approach guarantees the desired left-to-right expansion unequivocally.
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.cn
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