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

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

Mary-Kate Olsen
Libérer: 2025-01-04 05:41:39
original
215 Les gens l'ont consulté

How Can I Correctly Loop Through a C   Parameter Pack Using Pack Expansion?

Bouclage sur des packs de paramètres avec extension de pack

Dans l'extrait de code fourni, vous avez l'intention de parcourir un pack de paramètres de longueur variable à l'aide du syntaxe d'extension du pack. Cependant, le code ne parvient pas à se compiler avec l'erreur "Le pack de paramètres doit être étendu dans ce contexte."

Pour résoudre ce problème, vous devez placer l'extension du pack dans un contexte où elle est autorisée. Un emplacement approprié se trouve dans une liste d'initialisation entre accolades. Considérez le code modifié suivant :

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

Voici comment cela fonctionne :

  • Le code à l'intérieur de la liste d'initialisation du tableau factice est entouré de {}.
  • La syntaxe d'extension du pack est utilisée dans la liste d'initialisation. Plus précisément, ( (void) bar(std::forward(args)), 0) est développé pour chaque paramètre du pack.
  • L'opérateur virgule est utilisé pour séparer chaque expression, garantissant que le La fonction bar() est appelée pour chaque paramètre.
  • Les parenthèses autour bar(std::forward(args)) sont utilisés pour convertir le résultat en void. Cela garantit que l'opérateur virgule intégré est utilisé et non surchargé.
  • Le tableau factice est créé avec au moins un élément pour éviter de créer un tableau illégal de longueur 0 lorsque le pack de paramètres est vide.

Avec cette modification, le code sera compilé et bouclé avec succès sur le pack de paramètres.

C 17 Fold Expressions

En C 17, vous pouvez simplifier le code à l'aide d'expressions de pliage :

((void) bar(std::forward<Args>(args)), ...);
Copier après la connexion

Cette expression développe le pack et applique l'opération spécifiée (dans ce cas, en appelant bar( )) de gauche à droite.

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