首先,我已经在 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;
}
但是我不能/不想使用模板化函数,所以我想知道,因为它显然可以工作,所以必须有一个有效的函数签名才能使其正常工作?然而,我终其一生都无法弄清楚它是什么,或者为什么模板版本有效,而其他版本却没有。
任何帮助表示赞赏。
谢谢