Hier wird Setup meiner Anwendung vereinfacht:Enum-Wert abhängiger Funktionsaufruf
class Engine {
void run(); { // main program loop
while (state != gameState::quit)
step<state>(); // ERROR
}
template<gameState>
void step() {} // empty default step function
template<>
void step<gameState::intro>() { /* do step for intro state*/ }
template<>
void step<gameState::menu>() { /* do step for menu state*/ }
gameState state;
}
Was ich will ist die Sprungfunktion zu tun, rufen Sie abhängig von dem aktuellen Wert im Zustand Mitglied. In Schritt() -Aufruf ist der Zustand kein konstanter Ausdruck, der ein Problem darstellt. Gibt es eine Möglichkeit, diesen enumabhängigen Funktionsaufruf ohne großen hässlichen Schalter zu schreiben?
(Dies ist nur ein vereinfachtes Beispiel mit einer Funktion und nur 2 Zuständen).
Ihre Schrittvorlage ist inhärent ein Kompilierzeitkonstrukt, und die run() - Auswahl ist inhärent ein Laufzeitkonstrukt. Sie können nicht nur die zwei mischen. Sie können eine Metaprogrammierung anwenden, um alle möglichen Zustände in der Kompilierungszeit aufzuzählen und eine Runtime-Schalttafel zu erzeugen. Oder Sie können eine der vorhandenen Bibliotheken verwenden, die Boost MSM machen. –
[Dieser Artikel] (https://kfrlib.com/blog/how-c14-and-c17-help-to-write-faster-and-better-code-real-world-examples/) erwähnt einen 'cswitch' Vorlage, die dafür wahrscheinlich verwendet werden könnte. – zett42