我有一个填充了回调函数的向量,我想在添加之前检查函数的回调是否已经存在。我不知道它到目前为止是否会起作用甚至无法编译。
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;
}
}
这会产生编译错误: “过载分辨率在算法中选择了删除的算子'=='”(805)。这与find函数调用有关。
如何让它工作,甚至可以正确地将函数调用与相同的方法进行比较?
由于
答案 0 :(得分:2)
正如评论中所指出的,最简单的解决方案是使用默认的C风格函数指针,因为它们支持{C} 11 ==
运算符,而不是C ++ 11 function
。
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
*/
如果您不喜欢这种方法,您可以编写自己的函数指针类,并支持相等运算符。
答案 1 :(得分:0)
另一个解决方案是让一个类具有std :: function成员和另一个可竞争成员,然后重载()以获取std :: function参数并使用参数调用它,并使用==运算符进行竞争使用可比成员的班级。
CompareableFunction.h:
mWebView.clearHistory();
mWebView.clearCache(true);
mWebView.loadUrl("about:blank");
WebStorage.getInstance().deleteAllData();
mWebView.destroy();
CompareableFunction.cpp:
class CompareableFunction
{
public:
CompareableFunction(int nId, std::function<void(parameter)> handler);
~CompareableFunction();
void operator()(parameter param);
bool operator== (CompareableFunction compareableFunc);
private:
std::function<void(parameter)> m_handler;
int m_nId;
};
编辑:您可以将std :: function转换为C风格的函数指针并使用它进行比较。转换的示例如下:http://www.cplusplus.com/forum/general/63552/