Position de passage de l’argument de modèle variadique

Je voudrais créer une fonction qui prend un nombre variable d’arguments de modèle. Plus tard, avec ces arguments, la fonction devrait passer sa position comme ceci:

template R myFunction(Data &data, void *function) { auto f = (R (*)(Args...))function; return f(read(data, 1), read(data, 2), ...);// <-- This is the problem } 

Le code donné n’est bien sûr pas compilable. Y a-t-il un moyen de le réparer? Est-il possible de le faire sans modèles variadiques sans trop de duplication de code?

Oui, c’est possible

 // we need a comstack-time helper to generate indices template< std::size_t... Ns > struct indices { typedef indices< Ns..., sizeof...( Ns ) > next; }; template< std::size_t N > struct make_indices { typedef typename make_indices< N - 1 >::type::next type; }; template<> struct make_indices< 0 > { typedef indices<> type; }; 

Avec ces aides, vous avez besoin d’un transitaire pour votre fonction, comme ceci:

 template R myFunctionImpl(void *Data, void *function, indices ) { auto f = (R (*)(Args...))function; return f(read(Data, Ns + 1)...);// +1 because indices is zero-based } template R myFunction(void *Data, void *function) { return myFunctionImpl< R, Args... >( Data, function, typename make_indices::type() ); } 

EDIT: Comment ça marche? Tout d’abord, nous déterminons la taille du paquet d’arguments Args via sizeof... make_indices::type se développe ensuite en indices<0,1,2,...,N-1> . Elle est donnée en tant que paramètre supplémentaire à la fonction d’implémentation (du transitaire qui crée simplement une instance factice). Par conséquent, la déduction d’arguments débute du côté de la fonction d’implémentation et place les index générés dans le groupe d’arguments Ns .

La fonction d’implémentation a maintenant deux packs d’arguments de même taille, à savoir Args et Ns . Une fois développés dans les points de suspension ... , les points de suspension développent toute l’expression à laquelle ils sont appliqués et tous les ensembles de parameters en parallèle! Dans l’exemple ci-dessus, cette expression est read(Data, Ns+1) , ce qui se développe bien dans le pseudo-code OP.