我有一个填充回调函数的向量,我想在添加它之前检查函数的回调是否已经存在.我不知道它到目前为止是否会工作甚至不能编译.
vector<std::function<void(void*)>> _callbacks;
void Event::RegisterCallback(std::function<void(void*)> callback)
{
if (callback == NULL)
return;
vector<std::function<void(void*)>>::iterator it = std::find(_callbacks.begin(), _callbacks.end(), callback);
if (it == _callbacks.end())
{
_callbacks.push_back(callback);
}
else
{
//print error
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个编译错误:"算法中的重载分辨率选择删除操作符'=='"(805).这与find函数调用有关.
如何让它工作,甚至将函数调用与正确的方法进行比较?
谢谢
正如评论中所指出的,最简单的解决方案是使用默认的 C 风格函数指针,因为它们支持==与 C++11 相反的运算符,function而 C++11 不支持。
using func_type = void(*)();
vector<func_type> _callbacks;
void Event::RegisterCallback(func_type callback)
{
if (callback == nullptr)
return;
auto it = std::find(_callbacks.begin(), _callbacks.end(), callback);
if (it == _callbacks.end()) {
_callbacks.push_back(callback);
}
else {
throw;
}
}
void f() {};
void g() {};
/*
evt.RegisterCallback(f); // works fine
evt.RegisterCallback(g); // works fine
evt.RegisterCallback(f); // throws exception
*/
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢这种方法,您可以编写自己的函数指针类并支持相等运算符。