我具有以下功能
typedef std::function<void(const data<3> & data, void * userData )> callbackFnc;
和一些结构
typedef struct
{
callbackFnc callback;
void * userData;
} callbackData;
我将所有这些内容都存储在我的班级中vector
std::vector<std::shared_ptr<callbackData> > mCallbacks;
这是我添加的方式:
bool MyClass::addCallback(callbackFnc cbFunc, void * userData)
{
std::shared_ptr<callbackData> cb = std::make_shared<callbackData>();
cb->callback = cbFunc;
cb->userData = userData;
mCallbacks.push_back(cb);
}
现在,我要检查是否已添加给定功能并将其删除。为此,我只需要比较函数的地址,如下所示:
for (auto it = mCallbacks.begin(); it != mCallbacks.end(); it++)
{
// Compare address of these two functions
if ((&(*it)->callback) == &cbFunc)
{
mCallbacks.erase(it);
result = true;
break;
}
}
看起来这种比较是不正确的,但我不知道为什么。 任何建议都会有用。
谢谢!
答案 0 :(得分:6)
std::function
不是函数指针。您无法像比较函数指针一样比较std::function
。如果您比较两个std::function
,并且如果它们已擦除相同的函数,并期望它们等于每个std::function
,那将是行不通的。 A std::function
can only be compared to a nullptr
。这是std::function
唯一定义的相等运算符。
您的目标是识别一个std::string
并将其从已安装的回调函数向量中删除。完成这种功能的通常方法是为包装的函数分配一个单独的标签,通常是一个std::string
,为每个函数赋予唯一的名称,然后按名称查找该函数。不必一定是enum
,std::function
也可以工作。最重要的是,您将必须确定如何“识别”您的{{1}}。