我製作了包含函數的向量,但他們沒有參數列表。另外,他們不在課堂內。我有一個名爲Dialog
的類,我需要存儲具有特定簽名的函數指針。這是我對這些功能的typedef:帶參數的函數向量
typedef INT_PTR (*MsgHandler)(WPARAM,LPARAM);
但是,因爲它包含這些MsgHandler
的將是我Dialog
類,這將是我的CMainWnd
類被繼承,當我嘗試的push_back功能的載體,該功能的簽名與MsgHandler
不同。這是我的代碼,試圖的push_back載體中的功能時,4種變異和由此得到的誤差爲它們中的每:
typedef INT_PTR (*MsgHandler)(WPARAM,LPARAM);
class Dialog
{
protected:
Dialog(void); // Must be inherited
vector<MsgHandler> Handlers;
}
class CMainWnd : public Dialog
{
public:
INT_PTR MyHandler(WPARAM wp, LPARAM lp) {
return TRUE;
}
CMainWnd(void) {
// Attempt 1: Handlers.push_back(MyHandler);
// Attempt 2: Handlers.push_back(&MyHandler);
// Attempt 3: Handlers.push_back(CMainWnd::MyHandler);
// Attempt 4: Handlers.push_back(&CMainWnd::MyHandler);
}
};
嘗試1產生以下錯誤:
error C3867: 'CMainWnd::MyHandler': function call missing argument list; use '&CMainWnd::MyHandler' to create a pointer to member
嘗試2產率:
error C2276: '&' : illegal operation on bound member function expression
嘗試3個產率:
error C3867: 'CMainWnd::MyHandler': function call missing argument list; use '&CMainWnd::MyHandler' to create a pointer to member
嘗試4名,得到:
error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'INT_PTR (__thiscall CMainWnd::*)(WPARAM,LPARAM)' to 'const MsgHandler &'
我想嘗試4是最接近是正確的,但如前所述,因爲函數是一個成員,它改變了簽名。 如何可以存儲在矢量函數指針是在繼承Dialog
類定義:
- 具有
INT_PTR
- 返回類型具有兩個參數,第一個是一個
WPARAM
,並且第二個是一個LPARAM
- 是派生類,其constuctor是一個將它們添加到
聽說用boost::function
FO的載體中的一員做這樣的事情,但我已經查閱了它的文檔,我不知道如何使用它,這一切似乎讓我感到困惑。我非常想將這些函數添加到向量中,就好像它們是變量一樣,而不是通過綁定操作讓我的代碼陷入困境,而不是(可能只是因爲我對boost函數無知)。
有人能幫我弄清楚我在這裏做錯了什麼,或者告訴我如何使用boost::function
來做到這一點?對於boost::function
的方法,我試過聲明矢量爲vector<boost::function<INT_PTR(WPARAM,LPARAM)>>
,並嘗試添加MyHandler
,但沒有奏效。如果我不需要,我寧願不使用提升,但如果有人建議這樣做的推動方式,請說明我該如何做到這一點?
非常感謝你們。
沒有需要在這裏的lambda:'處理程序。push_back(std :: bind(CMainWnd :: MyHandler,this));'應該這樣做。 –
@MichaelAnderson:我會反擊,並說不需要'std :: bind',我們有lambda。這只是我個人的偏好。 –
@MichaelAnderson的確,我實際上已經忘記了你可以用'std :: bind'綁定'this'。 – Yuushi