std :: vector of std :: functions find

时间:2013-09-06 20:58:27

标签: c++ c++11

我有一个填充了回调函数的向量,我想在添加之前检查函数的回调是否已经存在。我不知道它到目前为止是否会起作用甚至无法编译。

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函数调用有关。

如何让它工作,甚至可以正确地将函数调用与相同的方法进行比较?

由于

2 个答案:

答案 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/