比较增强功能 - 功能签名?

时间:2013-09-06 19:48:34

标签: c++ function boost

首先,我已经在这里阅读了关于这个主题的其他主题,我已经阅读了boost faq aswell,我仍然觉得我没有回答下面的问题。

我希望使用像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;
}

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

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

boost::function个对象可以与其他函子和函数指针进行比较,但不能与其他boost::function个对象进行比较(参见参考文献here)。当您调用模板化版本时,T变为void(*)(int)函数指针,因此operator==有效,可以看到类型相同,并简单地比较{中的基础函数指针{1}}对象与您传入的函数指针。对于非模板化版本,您要比较两个boost::function对象,这些对象无效。