【问题标题】:How to remove function pointer from std::deque by val?如何通过 val 从 std::deque 中删除函数指针?
【发布时间】:2017-02-26 07:22:57
【问题描述】:

我正在使用std::deque 来保留回调函数。

除了删除特定的回调之外,一切都完美无缺。

typedef std::function<void(void)> cb_Action;
std::deque<cb_Action> actionCallbacks;

我可以一一添加或清除所有项目而没有任何问题。

但我无法从 deque 变量中删除特定回调。

actionCallbacks.erase ( std::remove(actionCallbacks.begin(), actionCallbacks.end(), callbackToRemove), actionCallbacks.end());

它给出了编译时错误:

binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void)>' (or there is no acceptable conversion)

那么,如何删除特定的cb_Action

【问题讨论】:

  • 这是因为 std::function 不能相互比较。 == 和 != 运算符的唯一重载是那些与 nullptr 进行比较的重载。
  • 我认为您应该存储包含回调及其处理程序的结构,例如size_t id,如果你想删除特定的回调,你应该提供它的处理程序
  • @stryku:我认为您的意思是“包含回调及其句柄”。 “处理程序”(名词)是“处理”(动词)某物的事物。回调是用 C++ 编写处理程序的典型方式。 “句柄”是(除其他外)您可以引用对象的一种方式。
  • @MartinBonner 你找到我了。我花了太多时间在 Windows 上编码 ;) 当然,说 handler 我的意思是回调 id 或类似的东西。

标签: c++ c++11 function-pointers deque member-function-pointers


【解决方案1】:

如果您处理常用功能,您可以根据std::function::target 执行类似的操作:

void callback_1(void) {}
void callback_2(void) {}

actionCallbacks = {
    std::function<void(void)>(callback_1),
    std::function<void(void)>(callback_2),
    std::function<void(void)>(callback_1)
};

actionCallbacks.erase(
    std::remove_if(actionCallbacks.begin(), actionCallbacks.end(), [](cb_Action action) {
        return (*action.target<void(*)(void)>() == callback_1);
    }),
    actionCallbacks.end()
);

这里所有带有callback_1的项目都被删除了。

【讨论】:

  • 这会产生同样的问题。它将std::function&lt;void(void)&gt; 与另一个std::function&lt;void(void)&gt; 进行比较。您示例中的 callback_1 被推回 actionCallbacks。所以我不能在比较方法中直接使用callback_1,当我使用cb_Action时,它仍然不起作用。
  • @frankish 我不明白你的意思,抱歉。此方法以完全有效的方式比较指向函数的指针。为什么不能直接使用callback_1
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多