小编典典

在一个类中使用具有成员函数的通用 std::function 对象

all

对于一个类,我想将一些指向同一类的成员函数的函数指针存储在一个map存储std::function对象中。但是我一开始就用这段代码失败了:

#include <functional>

class Foo {
    public:
        void doSomething() {}
        void bindFunction() {
            // ERROR
            std::function<void(void)> f = &Foo::doSomething;
        }
};

我收到error C2064: term does not evaluate to a function taking 0 argumentsxxcallobj一些奇怪的模板实例化错误。目前,我正在使用 Visual Studio 2010/2011 使用 Windows
8,使用 VS10 使用 Win 7,它也失败了。该错误必须基于我不遵循的一些奇怪的 C++ 规则


阅读 93

收藏
2022-06-11

共1个答案

小编典典

必须使用对象调用非静态成员函数。也就是说,它总是隐式地传递“this”指针作为它的参数。

因为您的std::function签名指定您的函数不接受任何参数 ( <void(void)>),所以您必须 绑定 第一个(也是唯一的)参数。

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

如果要绑定带参数的函数,需要指定占位符:

using namespace std::placeholders;
std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);

或者,如果您的编译器支持 C++11 lambda:

std::function<void(int,int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
}

(我现在 手头没有支持 C++11 的编译器,所以我无法检查这个。)

2022-06-11