Je cherche essentiellement à générer un wrapper pour une fonction C générique sans avoir à spécifier manuellement les types. J'ai donc un callback avec un prototype fixe mais je vais avoir besoin de faire du code spécial dans le wrapper basé sur le type de la fonction wrappée ... Donc en gros je pense à utiliser une méthode statique dans un template de classe pour envelopper ma fonction à une interface conforme par exemple:Paramètre de modèle non-type ... c'est un modèle! (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
et puis je voudrais faire quelque chose comme:
AddCallback(Wrapper<foobar>::wrapped);
Cependant, le problème est que je ne peux pas aller de l'avant et à l'utilisation un "S" dans le paramètre de la fonction dans le modèle Wrapper, je dois d'abord le lister comme un paramètre:
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
Mais cela signifie qu'il est beaucoup plus pénible à utiliser (Wrapper<void,float,foobar>::wrapped
), idéalement, je voudrais juste passer dans le pointeur de fonction là-bas et lui faire travailler les types de paramètres (et les types de retour) automatiquement. Pour être clair, à l'intérieur de la fonction enveloppée, je vais devoir me référer aux types de pointeur de fonction (donc j'ai besoin d'un équivalent de S ou T).
Existe-t-il une façon de procéder?
@damndirtyape: J'ai réfléchi à votre question et je pense que j'ai fait quelque chose de similaire. Malheureusement, cela impliquait beaucoup de code. Fondamentalement, ma solution avait une classe de base qui surchargeait operator() et j'avais des fonctions d'usine qui construisaient des classes de base basées sur le type de fonction passé. Si vous aimez je peux poster le code dans un pastebin quelque part. –