将类方法作为函数参数传递

时间:2016-08-07 09:23:01

标签: c++

我正在尝试将特定类实例的方法作为参数发送到函数(foo),尽管我不断收到此错误

  

无效使用非静态成员函数...

(来自行 foo(a-> bar)

我不确定为什么会收到此错误?它有可能解决吗?

#include <iostream>
#include <functional>

void foo(std::function<void(void)> _func)
{
    _func();
}

class A
{
public:
    A()
    {
        x = 5;
    }
    void bar()
    {
        std::cout << x << std::endl;
    }

private:
    int x;
};

int main() {
    A a;
    foo(a->bar);
    return 0;
}

2 个答案:

答案 0 :(得分:5)

您有两种选择:

  1. 使用std::bindfoo(std::bind(&A::bar, a)):

  2. 使用lambdasfoo([&a]() { a.bar(); });

答案 1 :(得分:0)

你的方法与std :: function不兼容,即使它看起来像。 每个方法都有一个隐含的第一个参数,即。

所以你的签名看起来像这样

void bar(A* this) { /* ... */ }

静态方法不是这种情况。这些类似于类的命名空间中的函数和

static void bar() { /* ... */ } 

将使std :: function饱和。

尽管如此,使用lambda(c ++ 11)很可能是更好的方法。