我制作了包含函数的向量,但它们没有参数列表。此外,他们不在班级内。我有一个名为 的类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
- 有两个参数,第一个是 a
WPARAM
,第二个是 aLPARAM
- 是派生类的成员,其构造函数是将它们添加到向量中的构造函数
我听说过使用它boost::function
来做这样的事情,但我已经查阅了它的文档,但我不知道如何使用它,这一切让我感到困惑。我非常想将函数添加到向量中,就好像它们是变量一样,而不是让我的代码陷入绑定操作等等。(可能只是因为我对增强功能一无所知)。
我在这里做错了什么,或者我可以boost::function
用来做这个吗?顺便说boost::function
一句,我尝试将向量声明为vector<boost::function<INT_PTR(WPARAM,LPARAM)>>
并尝试添加MyHandler
它,但这不起作用。如果不需要,我宁愿不使用 boost,但是如果有人建议这样做的 boost 方式,请说明我该怎么做?