Maison > développement back-end > C++ > 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 ?

Susan Sarandon
Libérer: 2024-11-11 03:51:02
original
285 Les gens l'ont consulté

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), ...);
Copier après la connexion

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

((void)f(args), ...);
Copier après la connexion

Solution pré-C 17

Une approche courante consiste à tirer parti de l'initialisation de la liste et à effectuer l'expansion dans it:

{ print(Args)... }
Copier après la connexion

Puisque print() renvoie void, vous pouvez contourner le problème en renvoyant int:

{ (print(Args), 0)... }
Copier après la connexion

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)... }
Copier après la connexion

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)... }
Copier après la connexion

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)... }
Copier après la connexion

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&amp;&amp;...) {}
    };
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal