一連のキー押下を一連のコマンドにマップしようとしています。複数の場所からコマンドを処理するため、キーとコマンドの間に抽象化レイヤーを設定して、基になるキー マッピングを変更した場合にコードをあまり変更する必要がないようにしたいと考えています。私の現在の試みは次のようになります。
// 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)、列挙子、const 変数、または定数式で初期化された整数型または列挙型の静的データ メンバーのみを含めることができる (8.5)」と主張する C++ 標準のビットを見てきました。 ...」。定数配列が「定数式で初期化された列挙型」としてカウントされない理由はまだわかりません。私の質問に対する答えが「その通りだから」というだけかもしれませんが、私はそれを回避する必要があります。しかし、そうであれば、コンパイラはコンパイル時にこれらの値を実際に決定できるため、ちょっとがっかりです。