派生クラスから関数ポインターを期待する基本クラス関数に関数を渡そうとしていますが、コンパイラエラーが発生します。
[BCC32 Error] E2034 Cannot convert 'void (Bar::*)(int)' to 'void (Foo::*)(int)'
これは設計どおりだと思いますが、不快なキャストを伴わない方法はありますか?boost::bind
ここで私を助けることができますか?
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
class Foo
{
public:
typedef void (Foo::*FFunc)(int i);
void test(FFunc f)
{
CALL_MEMBER_FN(*this,f)(123);
}
void barf1(int i) {};
};
class Bar : public Foo
{
public:
void barf2(int i) {};
};
void ffff()
{
Foo f;
f.test(Foo::barf1); // works
Bar b;
b.test(Bar::barf1); // works
b.test(Bar::barf2); // ERROR
}
ちなみに、私は仮想関数を使用してこれを正常に機能させています。これは、関数ポインターではなく明らかなアプローチですが、後でブースト::バインドのトリックを試みる前に、このように機能させようとしています...