我正在尝试将函数从派生类传递给需要函数指针的基类函数,但是我遇到了编译器错误。
[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
}
作为旁注,我使用虚函数可以正常工作,这是一种显而易见的方法而不是函数指针,但我只是想在以后尝试一些boost :: bind技巧之前让它以这种方式工作...
答案 0 :(得分:1)
b.test( ( Foo::FFunc )&Bar::barf2 );
抱歉,并不是故意将其作为答案提交,想发表评论。 Sample code
编辑:嗯,也许这是更“愉快”的演员,因为它是C ++风格? Updated sample. b.test( static_cast< Foo::FFunc >(&Bar::barf2) );
答案 1 :(得分:1)
同样,我对c ++ 11&amp;&amp ;;的了解也是如此。博斯特&amp;&amp; stl不是最好的,我只能建议这个:
template <typename T>
void test(void (T::*f)(int))
{
CALL_MEMBER_FN(static_cast<T&>(*this),f)(123);
}
所有其他代码与您的代码相同。
糟糕的投射,但它是隐藏的
答案 2 :(得分:1)
你能更多地概括一下函数指针吗?我的意思是这样的:
typedef void (Foo::*FFunc)(int i);
为:
typedef void (*FFunc)(int i);
然后你可以使用bind:
b.test(bind(&Bar::barf2, &b));