std :: vector of std :: functions find

Che*_*ebz 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个编译错误:"算法中的重载分辨率选择删除操作符'=='"(805).这与find函数调用有关.

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

谢谢

sas*_*hka 2

正如评论中所指出的,最简单的解决方案是使用默认的 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)

如果您不喜欢这种方法,您可以编写自己的函数指针类并支持相等运算符。