gpt4 book ai didi

c++ - 带参数的函数 vector

转载 作者:太空狗 更新时间:2023-10-29 20:05:34 25 4
gpt4 key购买 nike

我制作了包含函数的 vector ,但它们没有参数列表。此外,他们不在类(class)内。我有一个名为 Dialog 的类(class),我需要存储具有特定签名的函数指针。这是我对这些函数的定义:

typedef INT_PTR (*MsgHandler)(WPARAM,LPARAM);

但是,由于 vector 包含这些 MsgHandler会在我的 Dialog 里类,将由我的 CMainWnd 继承类,当我尝试 push_back 函数时,函数的签名不同于 MsgHandler 的签名.这是我的代码,尝试 push_back vector 中的函数的 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 中定义的 vector 中那:

  • 返回类型为 INT_PTR
  • 有两个参数,第一个是WPARAM ,第二个是 LPARAM
  • 是派生类的成员,派生类的构造函数是将它们添加到 vector 中的成员

我听说过使用 boost::function为了做这样的事情,但我已经查阅了它的文档,但我不知道如何使用它,这一切让我感到困惑。我非常想将函数添加到 vector 中,就好像它们是变量一样,而不是通过绑定(bind)操作和其他操作使我的代码陷入困境。 (可能只是因为我对boost函数一窍不通)。

我在这里做错了什么,或者我可以使用 boost::function去做这个?对于 boost::function方式,我尝试将 vector 声明为 vector<boost::function<INT_PTR(WPARAM,LPARAM)>>并尝试添加 MyHandler到它,但那没有用。如果没有必要,我宁愿不使用 boost,但如果有人建议使用 boost 方法,请说明我该怎么做?

最佳答案

如果您可以访问 C++11,这就是 lambda 真正发挥作用的地方。我将稍微更改您的代码,因为它更容易为我工作,但您应该能够很容易地修复它以满足您的需求:

#include <vector>
#include <functional>
#include <iostream>

class Dialog
{
protected:
Dialog() { } // Must be inherited
std::vector<std::function<bool (int, int)>> Handlers;
};

class CMainWnd : public Dialog
{
public:
bool MyHandler(int wp, int lp)
{
std::cout << "(" << wp << ", " << lp << ")\n";
return true;
}

CMainWnd()
{
Handlers.push_back([this](int wp, int lp) -> bool { return this->MyHandler(wp, lp); });
std::cout << Handlers[0](1,1) << "\n";
}
};

int main()
{
CMainWnd c;
return 0;
}

编辑:当使用 C++03 和 boost 时:

#include <boost/function.hpp>
#include <boost/bind.hpp>

class Dialog
{
protected:
Dialog() { } // Must be inherited
std::vector<boost::function<bool (int, int)> > Handlers;
};

class CMainWnd : public Dialog
{
public:
bool MyHandler(int wp, int lp)
{
std::cout << "(" << wp << ", " << lp << ")\n";
return true;
}

CMainWnd()
{
Handlers.push_back(boost::bind(&CMainWnd::MyHandler, this, _1, _2));
std::cout << Handlers[0](1,1) << "\n";
}
};

关于c++ - 带参数的函数 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12615897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com