C++ error:[ invalid operands to binary expression ('std::map<int, std::function<void ()>, std::less<int>...]

C++ error:[ invalid operands to binary expression ('std::map<int, std::function<void ()>, std::less<int>...]

使用以下代码:

#include <map>
#include <functional>
#include "main.h"
std::map<int,std::function<void()>> fnc_event_to;
void testFunction();
void initialize() {
  fnc_event_to[1] = testFunction;
  bool boolean = fnc_event_to[2] == testFunction;//<- error
  pros::lcd::initialize();
  pros::lcd::print(2,"%d",boolean);
}

我收到此错误:

invalid operands to binary expression ('std::map<int, std::function<void ()>, std::less<int>, std::allocator<std::pair<const int, std::function<void ()> > > >::mapped_type' (aka 'std::function<void ()>') and 'void (*)()')

为什么我可以将函数指针分配给地图,但我无法将它与函数指针进行比较?

另外,如果没有定义键,映射会怎样return?

有没有办法比较 std::function 以便我可以查看它是空函数指针还是已经定义?

或者对此有更好的解决方案吗?最初,我使用 while(1) 循环来捕获线程,而映射只是变量到达键 (int) 时程序应该执行的操作的映射。该变量在单独的任务中更改,因此它是多任务处理。我无法使用 .contains() 方法,因为我还没有使用 C++ 20。

标准classstd::function只有这些比较运算符==

template<class R, class... ArgTypes>
bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;

template<class R, class... ArgTypes>
bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;

所以你只能检查class的对象是否是"empty"。

仅供参考。答案引用自@0x499602D2 和@LightnessRacesInOrbit。 要么使用:

if (fnc_event_to[2]){
}

if(fnc_event_to.find(2) != fnc_event_to.end()){
}

请注意,第一个选项将创建一个空元素,因此如果您为地图赋予相同的值,它将已经创建,并且它将 return 为真。