Bouclage sur les packs de paramètres avec extension de pack
Dans les modèles variadiques, les packs de paramètres permettent de transmettre un nombre flexible d'arguments à une fonction . Lorsque vous essayez de parcourir un pack de paramètres, une erreur de compilation peut survenir si le pack n'est pas correctement développé.
Considérez le code suivant :
template<typename... Args> static void foo2(Args... args) { (bar(args)...); // Error: parameter pack must be expanded }
Ce code ne parvient pas à se compiler avec l'erreur "Erreur C3520 : 'args' : le pack de paramètres doit être étendu dans ce contexte." La raison de cette erreur est que les arguments du pack de paramètres doivent être développés avant de pouvoir être utilisés dans l'appel de la fonction bar.
Une façon de réaliser cette extension consiste à utiliser une braced-init-list (liste d'initialiseurs entre accolades). En plaçant l'expansion dans la liste d'initialisation d'un tableau factice, le compilateur peut effectuer l'expansion nécessaire.
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
La liste d'initialisation permet d'étendre le pack entier, et la conversion en void garantit que la virgule opérateur est utilisé, quels que soient les opérateurs surchargés pour le type de retour de la barre.
Une approche alternative, introduite en C 17, est l'utilisation de fold expressions :
((void) bar(std::forward<Args>(args)), ...);
Ce code fournit un moyen concis et efficace de parcourir le pack de paramètres.
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!