Я пытаюсь сопоставить набор нажатий клавиш с набором команд. Поскольку я обрабатываю команды из нескольких мест, я хотел бы установить уровень абстракции между ключами и командами, чтобы при изменении основных сопоставлений клавиш мне не пришлось сильно менять код. Моя текущая попытка выглядит так:
// 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) ... ". Я до сих пор не понимаю, почему константный массив не считается «типом перечисления, инициализированным константным выражением». Может быть так, что ответ на мой вопрос «потому что так оно и есть», и мне придется обойти это. Но если это так, то это разочаровывает, потому что компилятор действительно может определить эти значения во время компиляции.