枚举值依赖函数调用
Enum value dependant function call
这是我的应用程序的简化设置:
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() 调用中,状态不是常量表达式,这是一个问题。有没有一种方法可以在没有一些丑陋的大开关的情况下编写这个依赖于枚举的函数调用?
(这只是一个简化的例子,只有一个功能,只有两个状态)。
不,在使用非 constexpr
的状态时,您无法避免使用 switch
。这是状态机的本质。你所能做的就是尽量让它看起来不那么难看:
void dispatch_state(gameState st) {
switch(st) {
case gameState::intro: handle_intro(); break;
case gameState::menu: handle_menu(); break;
// etc...
}
}
UPD:还有其他调度技术,例如按照@KonstantinL 的建议存储函数指针数组,或者具有 std::function
的 std::map
,但它们中的每一个都需要您手动写下带有枚举器和相应处理程序的 table。在所有这些中,我更喜欢间接性最少的那个,它是普通的旧 switch
.
这是我的应用程序的简化设置:
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() 调用中,状态不是常量表达式,这是一个问题。有没有一种方法可以在没有一些丑陋的大开关的情况下编写这个依赖于枚举的函数调用?
(这只是一个简化的例子,只有一个功能,只有两个状态)。
不,在使用非 constexpr
的状态时,您无法避免使用 switch
。这是状态机的本质。你所能做的就是尽量让它看起来不那么难看:
void dispatch_state(gameState st) {
switch(st) {
case gameState::intro: handle_intro(); break;
case gameState::menu: handle_menu(); break;
// etc...
}
}
UPD:还有其他调度技术,例如按照@KonstantinL 的建议存储函数指针数组,或者具有 std::function
的 std::map
,但它们中的每一个都需要您手动写下带有枚举器和相应处理程序的 table。在所有这些中,我更喜欢间接性最少的那个,它是普通的旧 switch
.