gpt4 book ai didi

c++ - 比较 boost 功能 - 功能签名?

转载 作者:行者123 更新时间:2023-11-28 03:10:19 25 4
gpt4 key购买 nike

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

我想要一种使用像 boost::function 这样的函数包装器的委托(delegate)系统。我通过将 boost::function 对象存储在 vector 中来解决这个问题。问题来自于像 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;
}

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

感谢任何帮助。

谢谢

最佳答案

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

关于c++ - 比较 boost 功能 - 功能签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com