"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment appeler une fonction sur tous les arguments de modèles variadiques en C++ ?

Comment appeler une fonction sur tous les arguments de modèles variadiques en C++ ?

Publié le 2024-11-19
Parcourir:104

How to Invoke a Function on All Variadic Template Arguments in C  ?

Modèles variadiques C : appel d'une fonction sur tous les arguments de modèle

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 :

C 17 Fold Expression

(f(args), ...);

Cependant, si la fonction appelée renvoie potentiellement un objet avec un opérateur virgule surchargé, vous devez utiliser :

((void)f(args), ...);

Pre-C 17 Solution

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&&...) {}
    };
}
Dernier tutoriel Plus>

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