Comment parcourir un pack de paramètres à l'aide d'une extension de pack
Lors de l'utilisation de modèles et de fonctions variadiques, il est essentiel de comprendre l'utilisation du pack agrandissements. Considérez le code suivant :
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
Lors de la compilation, ce code échoue avec l'erreur :
Error C3520: 'args': parameter pack must be expanded in this context
La solution : extension du pack dans Braced-Init-List
Pour résoudre ce problème, vous pouvez utiliser une extension de pack au sein d'un braced-init-list :
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Comprendre la Braced-Init-List
La liste d'initialisation à l'intérieur de la définition du tableau étend l'extension du pack en un fichier séparé par des virgules liste. Le cast to void garantit que l'opérateur virgule utilisé est celui intégré plutôt que toute version surchargée. Cela garantit une évaluation de gauche à droite de l'expansion du pack.
Options supplémentaires avec C 17
En C 17, vous pouvez simplifier le code à l'aide d'expressions de pliage :
((void) bar(std::forward<Args>(args)), ...);
Conclusion
En utilisant une extension de pack au sein d'un braced-init-list ou une expression de repli en C 17, vous pouvez efficacement parcourir un pack de paramètres et éviter les erreurs de compilation. Comprendre cette technique est crucial pour travailler avec des modèles et des fonctions variadiques en C .
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!