Я пытаюсь сопоставить набор нажатий клавиш с набором команд. Поскольку я обрабатываю команды из нескольких мест, я хотел бы установить уровень абстракции между ключами и командами, чтобы, если я изменю базовые сопоставления клавиш, мне не пришлось менять очень много кода. Моя текущая попытка выглядит так:
// 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;
...
Но это выглядит гораздо менее элегантно. Кто-нибудь знает, почему здесь нельзя использовать константный массив?
РЕДАКТИРОВАТЬ: я видел часть стандарта С++, в котором утверждается, что «интегральное константное выражение может включать только литералы (2.13), перечислители, константные переменные или статические члены данных интегральных или перечисляемых типов, инициализированных константными выражениями (8.5) ...". Я до сих пор не понимаю, почему константный массив не считается «типом перечисления, инициализированным константным выражением». Просто может быть, что ответ на мой вопрос «потому что так оно и есть», и мне придется обойти это. Но если это так, то это немного разочаровывает, потому что компилятор действительно мог определить эти значения во время компиляции.