Modèles variadiques: itération sur l’argument type / modèle

J’ai travaillé avec libffi récemment, et comme il utilise une API C, toute abstraction est faite en utilisant des pointeurs de vides (bon vieux C). Je crée une classe (avec des modèles variadiques) qui utilise cette API. La déclaration de classe est la suivante: (où Ret = valeur de retour et Args = arguments de fonction)

 template  class Function 

Dans cette classe, j’ai deux fonctions différentes déclarées aussi (simplifiées):

 Ret Call(Args... args); // Calls the wrapped function void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...) 

Je veux pouvoir utiliser Call from CallbackBind ; et c’est mon problème. Je n’ai aucune idée de comment je suis censé convertir le tableau void* à la liste d’arguments basée sur des modèles. C’est ce que je veux plus ou moins:

 CallbackBind(Ret * ret, void * args[]) { // I want to somehow expand the array of void pointers and convert each // one of them to the corresponding template type/argument. The length // of the 'void*' vector equals sizeof...(Args) (variadic template argument count) // Cast each of one of the pointers to their original type *ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */); } 

Si cela n’est pas possible, existe-t-il des solutions de contournement ou des solutions différentes disponibles?

Vous ne voulez pas parcourir les types, vous voulez créer un pack de parameters et le développer dans un modèle variadic. Vous avez un tableau, donc le paquet que vous voulez est un paquet d’entiers 0,1,2 … servant d’index de tableau.

 #include  template struct Function { Ret (*wrapped_function)(Args...); template Ret dispatch(void* args[], redi::index_tuple) { return wrapped_function(*static_cast(args[I])...); } void CallbackBind(Ret * ret, void * args[]) { *ret = dispatch(args, to_index_tuple()); } }; 

Quelque chose comme ça, en utilisant index_tuple.h

L’astuce est que CallbackBind crée un index_tuple d’entiers représentant les positions d’argument, et dissortingbue à une autre fonction qui déduit les entiers et développe le pack dans une liste d’expressions de cast à utiliser comme arguments pour la fonction encapsulée.