Modèles variadiques : démêler l'extension du pack pour l'itération
Les modèles variadiques offrent une expressivité remarquable en C, mais s'aventurer dans leur domaine peut révéler des complexités imprévues. L’un de ces défis survient lorsque l’on tente de parcourir un pack de paramètres à l’aide de l’extension de pack. Considérez le code suivant :
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; }
Lors de la compilation, ce code rencontre une erreur : "'args' : le pack de paramètres doit être développé dans ce contexte." Le problème vient de l'incapacité d'étendre directement un pack de paramètres dans un appel de fonction.
La solution réside dans l'utilisation de l'expansion du pack dans une liste d'initialisation entre accolades, un contexte qui permet explicitement une telle expansion. En plaçant l'expansion dans la liste d'initialisation d'un tableau factice, nous pouvons forcer le comportement souhaité :
template<typename... Args> static void foo2(Args &&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Ce code révisé adopte une approche méticuleuse pour garantir une évaluation correcte :
En C 17, les expressions de pliage offrent une solution encore plus compacte :
((void) bar(std::forward<Args>(args)), ...); ``` This approach guarantees the desired left-to-right expansion unequivocally.
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!