Ich versuche, eine Reihe von Tastendrücken einer Reihe von Befehlen zuzuordnen. Da ich die Befehle von mehreren Stellen aus verarbeite, möchte ich eine Abstraktionsschicht zwischen den Schlüsseln und den Befehlen einrichten, so dass ich, wenn ich die zugrunde liegenden Schlüsselzuordnungen ändere, nicht sehr viel Code ändern muss. Mein aktueller Versuch sieht wie folgt aus:Verwenden von Elementen eines konstanten Arrays als Fälle in einer switch-Anweisung
// 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;
...
}
Wenn ich versuche, diese (gcc 4.3.2) Ich Meldung erhalten, den Fehler zu kompilieren:
error: 'LogicalMappings' cannot appear in a constant-expression
Ich sehe nicht, warum der Compiler ein Problem hat mit diesem. Ich verstehe, warum Sie nicht Variablen in einer case-Anweisung haben dürfen, aber ich hatte den Eindruck, dass Sie Konstanten verwenden könnten, da sie zur Kompilierzeit ausgewertet werden könnten. Funktionieren konstante Arrays nicht mit Switch-Anweisungen? Wenn ja, nehme ich an, ich könnte das Array nur durch etwas wie ersetzen:
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING = SDLK_RETURN;
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING_ELSE = SDLK_ESCAPE;
...
Aber das scheint viel weniger elegant. Weiß jemand, warum Sie hier kein konstantes Array verwenden können?
EDIT: Ich habe das Bit des C++ - Standards gesehen, der behauptet, dass "ein Integral-Konstantenausdruck nur Literale (2.13), Enumeratoren, Const-Variablen oder statische Datenelemente von Integral- oder Aufzählungstypen mit Konstanten initialisieren kann Ausdrücke (8.5) ... ". Ich verstehe immer noch nicht, warum ein konstantes Array nicht als "Aufzählungstyp mit einem konstanten Ausdruck initialisiert" zählt. Es könnte einfach sein, dass die Antwort auf meine Frage lautet: "Weil das so ist", und ich muss mich darum kümmern. Aber wenn das der Fall ist, ist es irgendwie enttäuschend, weil der Compiler diese Werte zur Kompilierzeit bestimmen kann.
Ein "Aufzählungstyp initialisiert mit einem konstanten Ausdruck" ist etwas wie "MyEnum a = 12", wobei MyEnum ein Aufzählungstyp ist (d. H. Mit dem Schlüsselwort enum deklariert/definiert). Ein Array-of-enum-Typ ist nicht identisch mit dem enum-Typ, aus dem er besteht. –