我正在尝试将一组按键映射到一组命令.因为我处理来自多个地方的命令,所以我想在键和命令之间设置一个抽象层,这样如果我更改底层键映射,我就不必更改很多代码.我目前的尝试看起来像这样:
// input.h enum LOGICAL_KEYS { DO_SOMETHING_KEY, DO_SOMETHING_ELSE_KEY, ... countof_LOGICAL_KEYS }; static const SDLKey LogicalMappings[countof_LOGICAL_KEYS] = { SDLK_RETURN, // Do Something SDLK_ESCAPE, // Do Something Else ... }; // some_other_file.cpp ... switch( event.key.keysym.key ) { case LogicalMappings[ DO_SOMETHING_KEY ]: doSomething(); break; case LogicalMappings[ DO_SOMETHING_ELSE_KEY ]: doSomethingElse(); break; ... }
当我尝试编译它(gcc 4.3.2)时,我收到错误消息:
错误:'LogicalMappings'不能出现在常量表达式中
我不明白为什么编译器有这个问题.我理解为什么你不允许在case语句中包含变量,但我认为你可以使用常量,因为它们可以在编译时进行评估.常量数组不适用于switch语句吗?如果是这样,我想我可以用以下代码替换数组:
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING = SDLK_RETURN; static const SDLKey LOGICAL_MAPPING_DO_SOMETHING_ELSE = SDLK_ESCAPE; ...
但这似乎不那么优雅.有人知道为什么你不能在这里使用常数数组吗?
编辑:我已经看到C++标准的一点声称,"一个整数常量表达式只能涉及文字(2.13),枚举器,常量变量或用常量表达式初始化的整数或枚举类型的静态数据成员(8.5) ...".我仍然不明白为什么常量数组不算作"用常量表达式初始化的枚举类型".可能只是我的问题的答案是"因为它就是它的方式",我将不得不解决它.但如果是这种情况,那就有点令人失望,因为编译器确实可以在编译时确定这些值.