std::function 与 std::function 的比较
std::function and comparison of std::function
我有以下功能
typedef std::function<void(const data<3> & data, void * userData )> callbackFnc;
和一些结构
typedef struct
{
callbackFnc callback;
void * userData;
} callbackData;
我将所有这些存储在我的 class 向量中
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;
}
}
看起来这个比较不正确,但我不明白为什么。
任何建议都会有用。
谢谢!
A std::function
不是函数指针。您不能像比较函数指针那样比较 std::function
。如果您比较两个 std::function
s,并期望它们在类型擦除相同函数的情况下与每个比较相等,那是行不通的。 A std::function
can only be compared to a nullptr
。这是 std::function
s.
唯一定义的相等运算符
您的目标是识别 std::function
并将其从已安装回调函数向量中删除。完成这种功能的通常方法是为包装函数分配一个单独的标签,通常是 std::string
为每个函数提供唯一名称,然后您可以通过名称找到该函数。它不一定是 std::string
,enum
也可以。最重要的是,您必须确定如何识别您的 std::function
"out of band"。
我有以下功能
typedef std::function<void(const data<3> & data, void * userData )> callbackFnc;
和一些结构
typedef struct
{
callbackFnc callback;
void * userData;
} callbackData;
我将所有这些存储在我的 class 向量中
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;
}
}
看起来这个比较不正确,但我不明白为什么。 任何建议都会有用。
谢谢!
A std::function
不是函数指针。您不能像比较函数指针那样比较 std::function
。如果您比较两个 std::function
s,并期望它们在类型擦除相同函数的情况下与每个比较相等,那是行不通的。 A std::function
can only be compared to a nullptr
。这是 std::function
s.
您的目标是识别 std::function
并将其从已安装回调函数向量中删除。完成这种功能的通常方法是为包装函数分配一个单独的标签,通常是 std::string
为每个函数提供唯一名称,然后您可以通过名称找到该函数。它不一定是 std::string
,enum
也可以。最重要的是,您必须确定如何识别您的 std::function
"out of band"。