En C, il est souvent souhaitable de parcourir les arguments de modèle variadiques et d'effectuer une opération spécifique, telle que l'appel une fonction. Ceci peut être réalisé en utilisant soit :
(f(args), ...);
Cependant, si la fonction appelée renvoie potentiellement un objet avec un opérateur virgule surchargé, vous devez utiliser :
((void)f(args), ...);
Une approche courante consiste à tirer parti de l'initialisation de la liste et à effectuer l'expansion dans it:
{ print(Args)... }
Puisque print() renvoie void, vous pouvez contourner le problème en renvoyant int:
{ (print(Args), 0)... }
Pour vous assurer que cela fonctionne avec n'importe quel nombre d'arguments, vous pouvez faire en sorte que le pack contient toujours au moins un élément :
{ 0, (print(Args), 0)... }
Vous pouvez encapsuler ce modèle dans un modèle réutilisable macro :
namespace so { using expand_type = int[]; } #define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Pour gérer les opérateurs virgules surchargés, vous pouvez modifier la macro :
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \ ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Si vous êtes préoccupé par une allocation de mémoire inutile, vous pouvez définir un type personnalisé qui prend en charge initialisation de liste mais ne stocke pas de données :
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
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!