0

メンバー関数の引数を繰り返す必要なく、メンバー関数のクラスをテンプレート化できるようにしたいと考えています。つまり、それらを自動的に派生させます。関数が取る引数の数に基づいてクラスに名前を付ける場合、これを行う方法はわかっていますが、それも派生させたいと考えています。

このようなものですが、これは機能しません (少なくとも、私のターゲット コンパイラである 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 引数に一致させることができないため、特殊化の構文が間違っています。

4

2 に答える 2

1

C++ 標準ライブラリはmem_fun_ref、nullary および unary 関数に対してのみ機能しますが、どのような種類の機能を必要に応じて提供します。もちろん、すべてのパラメーターを 1 つの引数として持つ構造体を使用できます。

于 2009-06-13T22:54:01.967 に答える