我正在尝试构建一个类来处理关键的回调。
为此,我将地图定义为:
class Keyboard {
public:
void registerCallback(int key, callback_fn func, bool repeat = false);
void onKeyEvent(int key, int state);
private:
typedef std::function<void (int)> callback_fn;
struct Callback {
Callback(callback_fn f, bool r)
: func(f), repeat(r), last_state(-1) {}
callback_fn func;
bool repeat;
int last_state;
};
std::unordered_map<int, std::vector<Callback>> callbacks;
};
然后我按照这样注册回调:
void Keyboard::registerCallback(int key, callback_fn func, bool repeat) {
// My understanding is that if there is nothing mapped to the key
// it will create a new vector. Otherwise it will return the mapped
// object. I did try checking if anything already exists at the key
// and if not creating a new vector but it yielded the same results.
callbacks[key].push_back({ func, repeat });
}
但是我遇到的问题是,映射的矢量似乎丢失了所有元素。
当我注册一个回调时,给定键的向量增加了,但当我尝试在另一个方法中迭代向量时,它没有元素。
下面是我迭代向量的方法。
void Keyboard::onKeyEvent(int key, int state) {
for(auto& callback : callbacks[key]) {
if(callback.repeat || callback.last_state != state) {
callback.func(state);
}
}
}
请注意,如果我将std::cout << callbacks[key].size() << std::endl;
添加到它打印的函数顶部0
。
如果重要的是我如何注册回调。
keyboard.registerCallback('w', [](int state) {
std::cout << "w " << (state == GLFW_PRESS ? "pressed" : "released") << std::endl;
}, true);
我怀疑我的问题源于我更习惯的Java地图与C ++地图
之间的差异答案 0 :(得分:3)
让我猜一下:问题是您收到的密钥代码是大写字母('W'
;字母键代码通常是大写的),但是注册一个小写字母的回调({{1} })。
答案 1 :(得分:0)
问题很可能是区分大小写的问题,因为您的代码没有什么特别之处,并且调试器中的10秒确认没有任何神奇的事情发生。只要您使用相同的“键盘”实例,那么它找不到您正在寻找的“键”的唯一原因是因为它与您注册的键不同。
您是否在调试器中单步执行并确定要搜索的密钥?你尝试输出了吗?
如果你必须处理变量大小写,那么你总是可以重载'unordered_map'来使用自定义散列函数,它可以为你做一个无谓的比较。