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