C ++错误:[对二进制表达式无效的操作数('std :: map <int,std :: function <void()>,std :: less <int> ...]

时间:2019-07-23 15:00:56

标签: c++ function function-pointers stdmap std-function

使用以下代码:

#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 (*)()')

为什么我可以将功能指针分配给映射,但无法将其与功能指针进行比较?

此外,如果未定义键,则映射将返回什么?

有没有一种比较std::function的方法,所以我可以看到它是否为空函数指针或已经定义了?

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

2 个答案:

答案 0 :(得分:3)

此信息仅供参考。答案引用自@ 0x499602D2和@LightnessRacesInOrbit。 可以使用:

if (fnc_event_to[2]){
}

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

请注意,第一个选项将创建一个空元素,因此,如果为地图提供相同的值,则将已经创建它,并且它将返回true。

答案 1 :(得分:0)

标准类std :: 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;

因此,您只能检查该类的对象是否为“空”。