gpt4 book ai didi

C++ 在映射中创建函数指针 vector

转载 作者:行者123 更新时间:2023-11-28 04:37:03 24 4
gpt4 key购买 nike

所以我有这个类,它应该允许任何其他类链接它们的成员函数,以便在事件发生时调用(即一个类可以有一个函数链接到箭头键按下和一个单独的函数链接到空格键),我正在尝试使用 map 来执行此操作,如下所示:

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 出于某种原因试图对空函数指针执行散列,但由于显而易见的原因失败了。

我完全不知道我能做些什么来解决这个问题,而不涉及编写我自己的 map 版本,我宁愿不这样做。

最佳答案

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

为了将 SDL_Event 用作 std::unordered_map 的键类型,您应该提供您的自定义“相等”函数来告诉您如何区分两个 SDL_Event,并且您应该提供您的自定义散列函数来告诉您如何从中计算散列值一个 SDL_Event,对于根据你的 equal 函数相等的两个 SDL_Event,这个哈希值应该相等,你可以使用 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;

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

关于C++ 在映射中创建函数指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51119401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com