1

首先,我已经在 SO 上阅读了关于该主题的其他主题,并且我也阅读了boost 常见问题解答,但我仍然觉得我对下面的问题没有答案。

我想拥有一种使用诸如 boost::function 之类的函数包装器的委托系统。我通过将 boost::function 对象存储在向量中来解决这个问题。问题来自像 UnregisterCallback() 这样的方法,人们希望将提供的回调与存储的回调进行比较,如果找到则将其删除。从我在网上收集到的信息来看,这是因为 boost 函数对象是不可比较的。

然而,使用 #2 中的模板,我也可以让它按照我的意愿工作。请参见下面的示例:

#include <vector>
#include <algorithm>
#include "boost/function.hpp"

typedef boost::function<void (int)> Callback;

class CallbackHandler
{
public:
    void AddCallback(const Callback& callback)
    {
        mCallbacks.push_back(callback);
    }

    // #1: dosnt work
    void RemoveCallback(const Callback& callback)
    {
        mCallbacks.erase(std::find(mCallbacks.begin(), mCallbacks.end(), callback));
    }

    // #2: works
    template <typename T>
    void RemoveCallback(const T& callback)
    {
        mCallbacks.erase(std::find(mCallbacks.begin(), mCallbacks.end(), callback));
    }

private:
    std::vector<Callback> mCallbacks;

};


void testCB(int i)
{
}


int _tmain(int argc, _TCHAR* argv[])
{
    CallbackHandler handler;
    handler.AddCallback(testCB);
    handler.RemoveCallback(testCB);

    return 0;
}

但是我不能/不想使用模板化函数,所以我想知道,因为它显然可以工作,所以必须有一个有效的函数签名才能使其正常工作?然而,我终其一生都无法弄清楚它是什么,或者为什么模板版本有效,而其他版本却没有。

任何帮助表示赞赏。

谢谢

4

1 回答 1

2

boost::function对象可以与其他仿函数和函数指针进行比较,但不能与其他boost::function对象进行比较(请参阅此处的参考资料)。当你调用模板化的版本时,T变成了void(*)(int)函数指针,所以operator==是有效的,可以看到类型是一样的,简单的比较boost::function对象中的底层函数指针和你传入的函数指针。对于非模板化的版本你正在比较两个boost::function对象,这是无效的。

于 2013-09-06T20:11:17.987 回答