Estoy intentando asignar un conjunto de teclas presionadas a un conjunto de comandos. Como proceso los comandos desde varios lugares, me gustaría configurar una capa de abstracción entre las teclas y los comandos para que, si cambio las asignaciones de teclas subyacentes, no tenga que cambiar mucho el código. Mi intento actual es el siguiente:Usar elementos de una matriz constante como casos en una instrucción de interruptor
// 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;
...
}
Cuando intento compilar este (gcc 4.3.2) me sale el mensaje de error:
error: 'LogicalMappings' cannot appear in a constant-expression
no veo por qué el compilador tiene un problema con este. Entiendo por qué no tiene permitido tener variables en una declaración de caso, pero tenía la impresión de que podría usar constantes, ya que podrían evaluarse en tiempo de compilación. ¿Las matrices constantes no funcionan con las declaraciones de cambio? Si es así, supongo que sólo podía sustituir la matriz con algo como:
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING = SDLK_RETURN;
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING_ELSE = SDLK_ESCAPE;
...
pero que parece mucho menos elegante. ¿Alguien sabe por qué no puedes usar una matriz constante aquí?
EDIT: He visto el bit de la norma C++ que afirma que "una expresión constante integral puede involucrar solo literales (2.13), enumeradores, variables const o datos estáticos miembros de tipos integrales o de enumeración inicializados con constante expresiones (8.5) ... ". Todavía no veo por qué una matriz constante no cuenta como un "tipo de enumeración inicializado con una expresión constante". Simplemente podría ser que la respuesta a mi pregunta es "porque así es como es" y tendré que evitarlo. Pero si ese es el caso, es un poco decepcionante, porque el compilador realmente podría determinar esos valores en tiempo de compilación.
Un "tipo de enumeración inicializado con una expresión constante" es algo así como "MyEnum a = 12", donde MyEnum es un tipo enumerado (es decir, declarado/definido con la palabra clave enum). Un tipo de matriz de enum no es lo mismo que el tipo de enumeración de la que es una matriz. –