0 Tage Serie
cpp / expert
Snippet

Diskreter Event-Dispatch via Funktionszeiger-Arrays

Anstatt große Switch-Case- oder If-Else-Blöcke zu verwenden, die zu Fehlprognosen der Verzweigung führen können, nutzt diese Technik eine Jump-Table (ein Array von Funktionszeigern). Dies ermöglicht einen O(1) Zeit-konstanten Dispatch zur entsprechenden Logik basierend auf einem Index.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
enum class Action { Start, Stop, Pause, Reset, Count };
void doStart() {} void doStop() {} void doPause() {} void doReset() {}
typedef void (*Handler)();
static const Handler jumpTable[] = { doStart, doStop, doPause, doReset };
void execute(Action a) {
if (a < Action::Count) {
jumpTable[static_cast<int>(a)]();
}
}
Erklärung
1
static const Handler jumpTable[] = { ... };
Definiert ein unveränderliches Array von Funktionszeigern, die den Enum-Werten entsprechen.
2
jumpTable[static_cast<int>(a)]();
Springt direkt zur Code-Adresse, die mit der Aktion verknüpft ist, und umgeht komplexe Verzweigungslogik.