Je veux être capable de modéliser une classe sur une fonction membre sans avoir besoin de répéter les arguments de la fonction membre - je les dérive automatiquement. Je sais comment faire cela si je nomme la classe en fonction du nombre d'arguments que la fonction prend, mais je veux aussi en déduire cela.Où puis-je trouver, ou comment puis-je créer un mécanisme de wrapper de modèle de fonction membre C++ élégant sans resporting pour booster?
Quelque chose comme ça, bien que cela ne fonctionne pas (au moins dans MSVC 2008 sp1, qui est mon compilateur cible):
class Foo {
void func0();
int func2(char *, float);
};
template<typename T> class Wrapper;
// specialize for zero-argument void func
template<typename Host, void (Host::*Func)()> class Wrapper<Func> : public Base {
... specialization goes here ...
};
// specialize for two-argument value func
template<typename Host, typename Ret, typename Arg0, typename Arg1, Ret (Host::*Func)(Arg0, Arg1)> class Wrapper<Func> : public Base {
... specialization goes here ...
};
A travers « Base » Je peux alors traiter ces polymorphically. En fin de compte, je veux l'utiliser pour créer une syntaxe simple wrapper pour un langage de script:
WrapClass<Bar> wrap(
MemberFunction<&Bar::func0>("func0") +
MemberFunction<&Bar::func2>("func2")
);
Cependant, cela ne fonctionne pas: la syntaxe de spécialisation est erronée, parce que vous ne pouvez pas correspondre à un pointeur de fonction à un argument typename.
N'ai-je pas mentionné l'exigence "pas de boost"? Je suppose que je ne l'ai pas fait. J'ai une telle exigence, cependant - désolé je ne l'ai pas mentionné. Cependant, je vais plonger dans les en-têtes boost et regarder ce qu'ils ont fait, et imiter le petit sous-ensemble dont j'ai besoin. Je crois que je finirai par devoir définir un template interne de Wrapper qui est spécialisé sur l'arité à son tour. –
Vous avez fait dans le titre. Cependant, mon point est; pour ce faire, vous avez besoin d'une bibliothèque de traits, et le seul que je connaisse est boost. Si vous voulez le faire sans coup de pouce, vous devrez rouler le vôtre ou en trouver un autre. –