以下是我的应用程序的简化设置:
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;
}
我想要做的是调用step函数,该函数取决于state成员中的当前值。在step()调用中,状态不是常量表达式,这是一个问题。有没有办法编写这个枚举依赖函数调用没有一些大丑陋的开关?
(这只是一个简单的例子,只有一个函数,只有2个状态)。
答案 0 :(得分:2)
不,在使用非constexpr
的状态时,您无法避免使用void dispatch_state(gameState st) {
switch(st) {
case gameState::intro: handle_intro(); break;
case gameState::menu: handle_menu(); break;
// etc...
}
}
。这是状态机的本质。你所能做的就是尽量让它看起来不那么难看:
std::map
UPD:还有其他调度技术,例如:存储一个函数指针数组,如@KonstantinL建议,或者std::function
switch
,但每个函数指针都要求您手动写下一个带有枚举器和相应处理程序的表。在所有这些中,我更喜欢具有最小间接的那个,它是普通的var iDiv = document.createElement('div');
iDiv.id = 'countdown';
iDiv.className = 'countdown';
。