【问题标题】:std::function and comparison of std::functionstd::function 和 std::function 的比较
【发布时间】: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)-&gt;callback == cbFunc
  • 你似乎在使用std::function,就像它是一个函数指针一样。不是,它不支持与std::nullptr_t以外的任何东西进行比较
  • cb-&gt;callback 是您传入的原始 std::function 的副本,而最后一个 sn-p 中的 cbFunc 可能是另一个实例(但没有足够的上下文可说)。它们永远不会有相同的地址,因为它们是不同的对象。也许std::function::target 可能有用,但最好还是使用普通函数指针。

标签: c++ std-function


【解决方案1】:

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

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

【讨论】:

  • 你能举一些例子来说明如何用字符串包装函数吗?是这样的stackoverflow.com/a/37545823/767523 吗?
  • 这是一种方法,使用std::mapstd::unordered_map 将任意标签映射到类型擦除的std::functions 要简单得多。
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多