C ++在映射内创建函数指针的向量

时间:2018-06-30 23:52:03

标签: c++

所以我有一个此类,该类应该允许任何其他类在发生事件时链接要调用的成员函数(即,一个类可以将一个函数链接到箭头键,而另一个函数链接到空格键) ),而我正尝试使用地图来做到这一点,就像这样:

std::unordered_map<SDL_Event, std::vector<void(*)(void)>> Callbacks;

但是这会导致此错误:

C2280   'std::hash<_Kty>::hash(const std::hash<_Kty> &)': attempting to reference a deleted function    

其他错误信息无济于事,因为它指向unordered_map的定义中的空白函数(第132行):

unordered_map()
    : _Mybase(key_compare(), allocator_type())
    {   // construct empty map from defaults
    }

据我所能理解的问题是,出于某种原因,unordered_map试图在空函数指针上执行哈希操作,并且出于显而易见的原因而失败。

我完全可以解决该问题,而不用编写自己的地图版本,而我不愿意这样做。

2 个答案:

答案 0 :(得分:1)

为了将SDL_Event用作std :: map(已排序)的键类型,您应该提供自定义的“小于”函数,该函数说明如何对两个SDL_Event进行排序。

为了将SDL_Event用作std :: unordered_map的键类型,您应该提供自定义的“等于”函数,该函数说明如何区分两个SDL_Event,并且应该提供自定义的哈希函数,该函数告诉如何从中计算哈希值一个SDL_Event,此哈希值应等于两个相等的SDL_Event(根据您的equal函数相等),您可以使用std :: hash应用于并组合到SDL_Event结构的某些字段中。

对SDL_Event使用小于运算符的映射的更简单方法:

#include <map>
#include <vector>
#include <SDL/SDL_events.h>

using namespace std;

inline bool operator<(const SDL_KeyboardEvent& lhs,
                      const SDL_KeyboardEvent& rhs)
{
    return lhs.keysym.sym < rhs.keysym.sym;
}

inline bool is_keyevent(const SDL_Event& ev)
{
    return ev.type == SDL_KEYDOWN || ev.type == SDL_KEYUP;
}

inline bool operator<(const SDL_Event& lhs, const SDL_Event& rhs)
{
    return lhs.type < rhs.type ||
           lhs.type == rhs.type && is_keyevent(lhs) && lhs.key < rhs.key;
}

map<SDL_Event, vector<void(*)(void)>> Callbacks;

请注意,本例中的less运算符为KEYDOWN和KEYUP提供了两个不同的条目。

答案 1 :(得分:0)

  

该类应该允许任何其他类在事件发生时链接其成员函数以供调用

除了事件类型之外,SDL_Event还包含许多您不需要的信息,例如事件发生的时间的时间戳。

由于唯一需要的是事件类型,因此应使用SDL_EventType枚举作为键:

std::unordered_map<SDL_EventType, std::vector<void(*)(void)>> Callbacks;

由于它是一个简单的枚举,因此不需要为其定义自定义比较器。