首先,我已经在这里阅读了关于这个主题的其他主题,我已经阅读了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中起作用。
感谢任何帮助。
由于
答案 0 :(得分:2)
boost::function
个对象可以与其他函子和函数指针进行比较,但不能与其他boost::function
个对象进行比较(参见参考文献here)。当您调用模板化版本时,T
变为void(*)(int)
函数指针,因此operator==
有效,可以看到类型相同,并简单地比较{中的基础函数指针{1}}对象与您传入的函数指针。对于非模板化版本,您要比较两个boost::function
对象,这些对象无效。