Maison > développement back-end > C++ > le corps du texte

Comment appeler une fonction sur des arguments de modèle variadique en C ?

DDD
Libérer: 2024-11-10 22:02:03
original
157 Les gens l'ont consulté

How do you call a function on a variadic template arguments in C  ?

Appel d'une fonction sur des arguments de modèle variadiques

En C, on peut souhaiter concevoir une fonction qui peut fonctionner de manière transparente sur un nombre arbitraire de arguments de diverses natures. Bien que la spécialisation récursive des modèles permette une telle fonctionnalité, elle produit une quantité substantielle de code redondant. Pour résoudre ce problème, une approche plus efficace est recherchée.

Solution d'expression de pli C 17

En C 17, une solution simple est fournie par l'expression de pli :

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

Cette expression facilite l'invocation séquentielle de f sur chaque argument du pack variadique args. Cependant, si f renvoie un objet avec un opérateur virgule surchargé, la syntaxe suivante doit être utilisée :

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

Solution pré-C 17

Avant C 17 , une approche typique impliquait l'emploi d'un initialiseur de liste avec un type de retour intentionnellement non vide :

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

Cependant, cela nécessite un emballage l'expression dans une variable inutilisée pour éviter les erreurs de compilation dues au type de retour void de print :

using expand_type = int[];
expand_type{ (print(Args), 0)... };
Copier après la connexion

Pour améliorer la réutilisabilité de ce modèle, une macro peut être définie :

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

SO_EXPAND_SIDE_EFFECTS(print(Args));
Copier après la connexion

Pour atténuer l'allocation potentielle de grands tableaux, une structure personnalisée peut être utilisée :

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal