对我来说,它看起来很安全在此代码投下void(Derived::*)()
到void(Base::*)()
,如:为什么我不能将指向派生类成员函数的指针转换为相同的Base类?
#include <iostream>
#include <typeinfo>
using namespace std;
struct Base{
void(Base::*any_method)();
void call_it(){
(this->*any_method)();
}
};
struct Derived: public Base{
void a_method(){
cout<<"method!"<<endl;
}
};
int main(){
Base& a=*new Derived;
a.any_method=&Derived::a_method;
a.call_it();
}
但是,编译器抱怨投在a.any_method=&Derived::a_method;
。这是阻止微妙编程错误的障碍,还是让编译器编写者更容易生活的一个障碍?有没有解决方法让Base
类有一个指向成员函数Derived
没有类型知识(也就是说,我不能让Base
模板参数Derived
模板)。
std :: function可以在这里帮助:'std :: function'有同样的问题,如果放弃给any_method成员的类型函数,那么没有必要使用'std :: function'而不是普通的空闲函数指针。对? –
2012-04-15 14:40:08
@洛伦佐:号'std :: function'。该函数可以存储它自己的'this'指针。另外,例如,在函数指针 - 有状态lambda表达式上总是有'std :: function'指向'std :: bind'的结果。我编辑了我的答案,以使std :: function'能够立即解决这个问题。 –
Puppy
2012-04-15 16:42:29