Maison  >  Article  >  développement back-end  >  Comment parcourir des listes d'arguments de modèles variadiques compressées en C ?

Comment parcourir des listes d'arguments de modèles variadiques compressées en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-23 18:09:02474parcourir

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

Itérer sur des listes d'arguments de modèle variadiques compressées

En C, itérer sur une liste d'arguments de modèle variadique compressée pose des défis spécifiques en raison du manque de capacités de réflexion au moment de la compilation. Cependant, il existe des techniques qui nous permettent d'aborder cette tâche.

Comprendre le problème

L'objectif est de parcourir un pack d'arguments de modèle, en extrayant des données spécifiques types (par exemple, int, char*, float) et en les stockant dans des vecteurs séparés. De plus, un vecteur est nécessaire pour suivre l'ordre dans lequel les arguments sont apparus.

Approche de la solution

Utilisation des expressions Fold avec Lambda :

Pour les entrées de type mixte, les expressions C 17 fois peuvent être utilisées avec une expression lambda. Le lambda encapsule le comportement de boucle, incrémente un compteur et imprime la valeur de chaque entrée avec sa position.

<code class="cpp">template<class ... Ts>
void Foo(Ts && ... inputs) {
    int i = 0;
    ([&]() {
         ++i;
         std::cout << "input " << i << " = " << inputs << std::endl;
    }(), ...);
}

Gestion des instructions Return/Break :

If return ou Les instructions break sont requises dans la boucle, des solutions de contournement peuvent être implémentées :

  • Utilisation de Try/Throw : Lancez des exceptions pour échapper à la boucle. Remarque : Cette approche peut ralentir considérablement la fonction.
  • Commutateurs de variable/si : Utilisez une instruction switch contrôlée par une variable représentant chaque type. Ce n'est pas idéal mais peut gérer les instructions return/break.

Approche de macro personnalisée :

Une approche alternative consiste à créer une macro personnalisée qui construit un type pour contient tous les arguments, puis les développe à l'intérieur d'un vecteur. Bien qu'il s'agisse d'une méthode non standard, elle peut obtenir la fonctionnalité souhaitée.

<code class="cpp">struct any {
  void do_i(int e) { INT = e; }
  void do_f(float e) { FLOAT = e; }
  void do_s(char* e) { STRING = e; }

  int INT;
  float FLOAT;
  char* STRING;
};

#define def(name) \
  template<typename... T> \
  auto name(T... argv) -> any { \
   std::initializer_list<any> argin = { argv... }; \
    std::vector<any> args = argin;
#define get(name, T) get<T>()(args[name])
#define end }</code>

Cette approche nécessite d'appeler manuellement les fonctions arg() pour créer une instance quelconque pour chaque argument.

Conclusion

Itérer sur des listes d'arguments de modèles variadiques remplies en C nécessite des solutions innovantes. Les approches discutées ici relèvent ce défi, permettant une gestion efficace des arguments de type mixte tout en maintenant la portabilité et la compatibilité multiplateforme.

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