目前我正在尝试一个基本上执行以下操作的代码:
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
return 0;
}
这工作得很好。但是我被这种模式卡住了。我想检查是否已经注册了回调,并且我希望能够通过从向量中删除回调来取消注册回调。我刚刚了解到std::function
对象无法比较,这意味着无法在容器中搜索它们的存在。
所以我需要一个替代方案。当然,我想保留编译时类型检查和注册任意类方法的能力。
如何实现允许取消注册回调并检查双重注册的类似解决方案?我需要接受任何权衡吗?