如何正确绑定类函数

How to std::bind a class function properly?

本文关键字:类函数 绑定 何正确      更新时间:2023-10-16
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

编辑:选择禁卫军的答复作为答案,因为它解决了问题。Dietmar Kühl's也是一个很好的解决方案,但不是这个问题的实际答案。必须公平:D

Func1是一个

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

所以你需要

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

在调用绑定函数之前,请确保a的生存期不会结束。

两个问题。第一

A a(); 

是一个函数声明。你需要

A a;

然后

fl.push_back(std::bind(&A::Func1, &a, 1,1));
你也可以

不使用std::bind()

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

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

不幸的是,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(隐式的"this"指针,即要调用方法的对象。

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

另请注意,不幸的是,您无法使用"A a((;"创建"A"的实例这是"最令人烦恼的解析"。正确的方法是"A a;"或"A a{};"