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
Mary-Kate Olsenoriginal
2025-01-04 05:41:39151parcourir

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) ... };
}

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)), ...);

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