【发布时间】:2018-07-23 11:10:21
【问题描述】:
我有以下功能
typedef std::function<void(const data<3> & data, void * userData )> callbackFnc;
还有一些结构
typedef struct
{
callbackFnc callback;
void * userData;
} callbackData;
我将所有这些都存储在我的类中的向量中
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;
}
}
看起来这个比较不正确,但我不知道为什么。 任何建议都会很有用。
谢谢!
【问题讨论】:
-
您将
callback成员的地址与函数指针的地址进行比较。您应该将callback的内容与(地址)函数进行比较。(*it)->callback == cbFunc -
你似乎在使用
std::function,就像它是一个函数指针一样。不是,它不支持与std::nullptr_t以外的任何东西进行比较 -
cb->callback是您传入的原始std::function的副本,而最后一个 sn-p 中的cbFunc可能是另一个实例(但没有足够的上下文可说)。它们永远不会有相同的地址,因为它们是不同的对象。也许std::function::target可能有用,但最好还是使用普通函数指针。
标签: c++ std-function