Maison  >  Article  >  développement back-end  >  Comment les expressions C 17 Fold peuvent-elles simplifier l'invocation de fonctions variadiques ?

Comment les expressions C 17 Fold peuvent-elles simplifier l'invocation de fonctions variadiques ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-19 11:17:02913parcourir

How Can C  17 Fold Expressions Simplify Variadic Function Invocation?

Simplification de l'invocation de fonctions variadiques à l'aide de C 17 Folds

Les arguments de modèle variadiques fournissent un moyen pratique de travailler avec des fonctions qui acceptent un nombre variable d'arguments . Cependant, créer des chaînes récursives pour appeler des fonctions sur chaque argument variadique peut conduire à une génération de code redondante. Voici comment vous pouvez surmonter ce problème en utilisant des expressions de pli C 17 ou une solution pré-C 17.

Expression de pli C 17 :

(f(args), ...);

Cette expression de pli peut être utilisé pour appeler une fonction sur tous les arguments de modèle variadiques, ce qui entraîne un seul appel de fonction N-arg.

Solution pré-C 17 :

1 . Envelopper la fonction dans l'identifiant :

Transformer la fonction pour renvoyer un entier, qui peut être utilisé comme argument factice dans une liste d'initialisation :

int print_wrap(const T& t) {
  print(t);
  return 0;
}

2. Créer un initialiseur de liste :

Utilisez un initialiseur de liste pour développer les arguments variadiques et appeler la fonction modifiée :

{ print_wrap(args)... }

3. Définir un espace de noms d'assistance :

Pour rendre cette approche réutilisable, définissez un espace de noms d'assistance :

namespace so {
  using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

4. Utilisation :

SO_EXPAND_SIDE_EFFECTS(f(args));

Avantages :

  • Génère un seul appel de fonction avec N arguments.
  • Prend en charge les fonctions avec opérateurs virgules surchargés.
  • Assure une évaluation de gauche à droite des arguments.

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