如何正确绑定类函数
How to std::bind a class function properly?
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{};"
相关文章:
- 将自由函数绑定为类成员函数
- 在派生类中绑定非静态模板化成员函数
- 有没有办法将重载的类函数绑定到函数对象?
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何将 STL 队列推送函数绑定到 std::函数?
- 如何在 C# 中将带有参数的函数绑定到包中
- 如何仅使用 c/python API 将 c++ 成员函数绑定到 python?
- 将非静态函数绑定到回调时出现问题
- 意外输出..函数绑定在虚拟表中的发生方式
- 将类实例函数绑定到 v8::FunctionTemplate
- 是否可以将匿名 lambda 函数绑定到对象以允许 lambda 中的代码访问对象的成员?
- 使用JNI将C 类成员函数绑定到Java
- 将静态成员函数绑定为回调
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 如何将C++函数绑定到xaml文本块属性
- boost::使用成员函数绑定回调的帮助
- 如何将成员函数绑定到 C++14 中的对象
- std::函数绑定到成员函数
- 将类成员绑定到plain-C函数指针
- boost::为模板类中的非静态成员函数绑定