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