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 à y effectuer l'expansion :
{ 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 un certain nombre d'arguments, vous pouvez faire le pack contient toujours au moins un élément :
{ 0, (print(Args), 0)... }
Vous pouvez encapsuler ce modèle dans une macro réutilisable :
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 la liste- initialisation mais ne stocke pas les données :
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3