【发布时间】:2015-02-21 19:55:06
【问题描述】:
我想使用方法作为回调。我知道有一种非常通用的语法允许使用任何类型的可调用作为回调:
void f(int x) { cout << "f("<<x<<")" << endl; }
class C
{
public:
void m(int x) { cout << "C::m("<<x<<")" << endl; }
};
class C2
{
public:
void registerCallback(function<void(int)> f)
{
v.push_back(f);
}
private:
vector<function<void(int)>> v;
void callThem()
{
for (int i=0; i<v.size(); i++)
{
v[i](i);
}
}
};
int main()
{
C2 registrar;
C c;
registrar.registerCallback(&f); // Static function
registrar.registerCallback(bind(&C::m, &c, placeholders::_1)); // Method
getline(cin, string());
return 0;
}
请注意,必须可以将任何类的方法注册为回调。
但是我想允许以下更方便的语法来注册方法:
registrar.registerCallback(&C::m, c); // Method
是否可以提供registerCallback() 重载,允许更基本的语法,而无需在注册方法时使用bind?
【问题讨论】:
-
您是否尝试过重载
registerCallback,这是一个将调用std::bind的结果传递给registerCallback的当前实现的模板? -
没有。我会试试看。那么没有绑定就没有明智的方法来实现吗?
-
根据您要完成的工作
std::bind似乎是构造函数对象的最明智的方式。
标签: c++ c++11 methods callback