我正在尝试将一组按键映射到一组命令。由于我从几个地方处理命令,因此我希望在按键和命令之间建立一层抽象,以便如果我更改底层键映射,我不必更改太多的代码。我的当前尝试看起来像这样:
// 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),会出现以下错误信息:
error: '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)、枚举器、整数或枚举类型的const变量或静态数据成员,这些变量或成员用常量表达式初始化(8.5)……”。我仍然不明白为什么常量数组不算作“用常量表达式初始化的枚举类型”。可能只是因为我的问题的答案是“因为它就是这样”,我必须绕过它。但如果是这样的话,有点令人失望,因为编译器确实可以在编译时确定这些值。