メンバー関数の引数を繰り返す必要なく、メンバー関数のクラスをテンプレート化できるようにしたいと考えています。つまり、それらを自動的に派生させます。関数が取る引数の数に基づいてクラスに名前を付ける場合、これを行う方法はわかっていますが、それも派生させたいと考えています。
このようなものですが、これは機能しません (少なくとも、私のターゲット コンパイラである MSVC 2008 sp1 では):
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 ...
};
「ベース」を通じて、これらをポリモーフィックに扱うことができます。最後に、これを使用して、スクリプト言語の単純なラッパー構文を作成したいと思います。
WrapClass<Bar> wrap(
MemberFunction<&Bar::func0>("func0") +
MemberFunction<&Bar::func2>("func2")
);
ただし、それは機能しません。関数ポインターを typename 引数に一致させることができないため、特殊化の構文が間違っています。