C++ 如何通过val从std::deque中删除函数指针?

C++ 如何通过val从std::deque中删除函数指针?,c++,c++11,function-pointers,deque,member-function-pointers,C++,C++11,Function Pointers,Deque,Member Function Pointers,我使用std::deque保留回调函数 除了删除一个特定的回调外,其他一切都可以正常工作 typedef std::function<void(void)> cb_Action; std::deque<cb_Action> actionCallbacks; 它给出编译时错误: binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void

我使用
std::deque
保留回调函数

除了删除一个特定的回调外,其他一切都可以正常工作

typedef std::function<void(void)> cb_Action;
std::deque<cb_Action> actionCallbacks;
它给出编译时错误:

binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void)>' (or there is no acceptable conversion)
binary'=':未找到接受类型为“std::function”的左侧操作数的运算符(或没有可接受的转换)

那么,如何删除特定的
cb_操作

如果您处理常规功能,您可以基于以下内容执行类似操作:

void回调_1(void){
void callback_2(void){}
actionCallbacks={
std::函数(回调_1),
std::函数(回调_2),
std::函数(回调_1)
};
actionCallbacks.erase(
std::remove_if(actionCallbacks.begin(),actionCallbacks.end(),[](cb_Action动作){
return(*action.target()==callback_1);
}),
actionCallbacks.end()
);

在这里,所有内部带有
callback\u 1
的项都被删除。

这是因为std::function不能相互比较。==和!=的唯一重载运算符是与nullptr进行比较的运算符。我认为您应该存储包含回调及其处理程序(如size\t id)的结构,如果您想删除特定回调,则应该提供handler@stryku:我想你的意思是“包含回调及其句柄”。“handler”(名词)是指处理(动词)某物的事物。回调将是C++中编写处理程序的典型方式。“句柄”是(除其他外)你可以引用对象的一种方式。@MartinBonner你找到我了。我花了太多时间在windows上编写代码;)当然,我说的handler是指回调id或类似的东西。这会产生同样的问题。它将
std::function
与另一个
std::function
进行比较。示例中的回调_1被推回到actionCallbacks。所以我不能在比较方法中直接使用回调函数1,当我使用cb_操作时,它仍然不起作用。@frankish我不太明白你的意思,对不起。此方法以完全有效的方式将指针与函数进行比较。为什么您不能直接使用
callback\u 1
binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void)>' (or there is no acceptable conversion)
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()
);