對我來說,它看起來很安全在此代碼投下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