Ich möchte in der Lage sein, eine Klasse für eine Member-Funktion zu templatisieren, ohne die Argumente der Member-Funktion wiederholen zu müssen - dh, sie automatisch abzuleiten. Ich weiß, wie dies zu tun ist, wenn ich die Klasse basierend auf wie viele Argumente die Funktion nennt, aber ich möchte auch das ableiten.Wo kann ich einen eleganten C++ - Memberfunktionsvorlagen-Wrappermechanismus finden, oder wie kann ich ihn erstellen, ohne zu boosten?
So etwas wie dies, obwohl dies nicht (zumindest in MSVC 2008 sp1, die mein Ziel Compiler) funktioniert:
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 ...
};
Durch "Base" ich diese polymorph dann behandeln kann. Am Ende mag ich dies verwenden, um eine einfache Wrapper-Syntax für eine Skriptsprache zu erstellen:
WrapClass<Bar> wrap(
MemberFunction<&Bar::func0>("func0") +
MemberFunction<&Bar::func2>("func2")
);
jedoch, das nicht funktioniert: die Spezialisierung Syntax ist falsch, weil Sie nicht einen Funktionszeiger bieten können zu einem Typname Argument.
Habe ich nicht die Anforderung "kein Boost" erwähnt? Ich denke, ich habe es nicht getan. Ich habe eine solche Anforderung, tut mir leid, ich habe es nicht erwähnt. Ich werde jedoch in die Boost-Header eintauchen und schauen, was sie getan haben, und die kleine Teilmenge nachahmen, die ich brauche. Ich glaube, ich werde am Ende eine innere Vorlage von Wrapper definieren müssen, die wiederum auf Arity spezialisiert ist. –
haben Sie im Titel getan. Mein Punkt ist jedoch; Um dies zu tun, brauchst du eine Charakterbibliothek, und die einzige, die ich kenne, ist Boost. Wenn du es ohne Boost machen willst, musst du dein eigenes rollen oder ein anderes finden. –