如何正确绑定一个类函数?

时间:2014-12-16 21:55:24

标签: c++ class object callback

class A
{
public:
    A();
    void Func1(int,int);
    void Func2(long,long);
private:
    ...
};

<implementation here>

主要:

std::vector<std::function<void(void)>> fl;
A a;
fl.push_back(std::bind(&a.Func1, 1,1));

给出错误: ISO C ++禁止获取绑定成员函数的地址以形成指向成员函数的指针

解?

编辑:更改了“A a();”到“A a;”。这里没有构造函数:P

编辑: 选择Praetorian的答案作为答案,因为它解决了问题。 DietmarKühl's也是一个很好的解决方案,但不是问题的实际答案。 要公平:D

4 个答案:

答案 0 :(得分:3)

Func1是一个非静态成员函数,因此必须在A的实例上调用它,您需要bind作为第一个参数( this指针)。此外,在创建指向成员函数的指针时,语法为&ClassName::MemFuncName

所以你需要

fl.push_back(std::bind(&A::Func1, &a, 1, 1));

确保在调用绑定函数之前a的生命周期没有结束。

答案 1 :(得分:1)

两个问题。首先,

A a(); 

是一个函数声明。你需要

A a;

然后,

fl.push_back(std::bind(&A::Func1, &a, 1,1));

答案 2 :(得分:1)

您也可以不使用std::bind()

std::vector<std::function<void(void)>> fl;
A a{};
fl.push_back([&](){ a.Func1(1, 1); });

代码在堆栈上显示引用a。当函数对象没有比a更长时,这没关系。如果无法保证,您可能希望将&替换为复制对象的=。顺便说一下,从(){}的微妙变化导致代码将a声明为A类型的对象,而不是作为不带参数的函数并返回{{1} }。

答案 3 :(得分:0)

很遗憾,C ++没有这样的语法。具有正确语法的完整示例如下所示:

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

using namespace std;

class A
{
public:
    A() {}
    void Func1(int,int) {}
    void Func2(long,long) {}
};


int main() 
{

    std::vector<std::function<void(void)>> fl;
    A a;
    fl.push_back(std::bind(&A::Func1, &a, 1,1));
    return 0;
}

你需要提供两件事(至少):1)指向成员函数的指针2)隐含的&#34; this&#34;指针,即您要调用方法的对象。

然后您可以添加要绑定的参数。

另请注意,遗憾的是,您无法创建&#34; A&#34;与&#34; A a();&#34;这是最令人烦恼的解析&#34;。正确的方法是&#34; A a;&#34;或&#34; A a {};&#34;