c++ - std::function 和 std::function 的比较

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

看起来这个比较不正确,但我不明白为什么。 任何建议都会有用。

谢谢!

最佳答案

std::function 不是函数指针。您不能像比较函数指针那样比较 std::function。如果您比较两个 std::function,并期望它们在类型删除相同函数时与每个比较相等,那是行不通的。 A std::function can only be compared to a nullptr .这是为 std::function 定义的唯一相等运算符。

您的目标是识别一个 std::function 并将其从已安装回调函数的 vector 中删除。完成这种功能的通常方法是为包装函数分配一个单独的标签,通常是 std::string 为每个函数提供唯一名称,然后您可以通过名称找到该函数.它不一定是 std::stringenum 也可以。最重要的是,您必须确定如何“带外”识别您的 std::function

关于c++ - std::function 和 std::function 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51477423/

相关文章:

c# - System.EntryNotFoundException : Unable to find the entry point in the DLL

C++:如何将数据输出到多个.dat 文件?

c++ - 如何实现创建递归 lambda 并返回它的方法

c++ - 在成员初始化列表中使用 std::function

C++ 将任意函数从 DLL 动态加载到 std::function

c++ - 自由函数和成员函数的自定义 std::function-like 实现

c# - Visual Studio 2013 在针对 C++ 应用而非 C# 的 WinCE 部署时挂起

C++ 相当于.net Stream?

c++ - std::function 到可变参数成员函数,然后绑定(bind)可变参数模板参数

C++:从重载函数到 std::function 的转换