std :: function和std :: function的比较

时间:2018-07-23 11:10:21

标签: c++ std-function

我具有以下功能

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;
    }
}

看起来这种比较是不正确的,但我不知道为什么。 任何建议都会有用。

谢谢!

1 个答案:

答案 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,为每个函数赋予唯一的名称,然后按名称查找该函数。不必一定是enumstd::function也可以工作。最重要的是,您将必须确定如何“识别”您的{{1}}。