7

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

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;
    }
}

这会产生一个编译错误:alorithm(805) 中的“重载分辨率选择删除的运算符'=='”。这与 find 函数调用有关。

我如何让它工作,它甚至会正确地比较对同一方法的函数调用吗?

谢谢

4

2 回答 2

2

如评论中所述,最简单的解决方案是使用默认的 C 样式函数指针,因为它们支持==运算符,而 C++11function则不支持。

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
*/

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

于 2013-09-07T15:52:19.237 回答
0

另一种解决方案是拥有一个具有 std::function 成员和另一个可比较成员的类,然后重载 () 以获取 std::function 参数并使用参数调用它,然后使用 == 运算符来比较类相当的成员。

比较函数.h:

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;
};

比较函数.cpp:

CompareableFunction::CompareableFunction(int nId, std::function<void(parameter)> handler)
{
    m_nId = nId;
    m_handler = handler;
}


CompareableFunction::~CompareableFunction()
{
}

void CompareableFunction::operator()(parameter param)
{
    return m_handler(param);
}

bool CompareableFunction::operator==(CompareableFunction compareableFunc)
{
    return (m_nId == compareableFunc.m_nId);
}

编辑:您可以将 std::function 转换为 C 风格的函数指针并使用它进行比较。转换示例在这里:http ://www.cplusplus.com/forum/general/63552/

于 2017-09-18T13:46:57.510 回答