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
Susan Sarandonoriginal
2024-11-11 03:51:02332parcourir

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), ...);

Solution pré-C 17

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&amp;&amp;...) {}
    };
}

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!

Déclaration:
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