0

这是我的应用程序的简化设置:

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 函数。在 step() 调用中,状态不是常量表达式,这是一个问题。有没有办法编写这个依赖枚举的函数调用而不需要一些大的丑陋开关?

(这只是一个简化的例子,只有一个功能和两个状态)。

4

1 回答 1

2

不,你不能避免switch在使用状态不是时使用constexpr。这就是状态机的本质。你所能做的就是尽量让它看起来不那么难看:

void dispatch_state(gameState st) {
    switch(st) {
        case gameState::intro: handle_intro(); break;
        case gameState::menu:  handle_menu(); break;
        // etc...
    }
}

UPD:还有其他调度技术,例如存储函数指针数组,如@KonstantinL 建议的那样,或者具有std::mapof std::functions,但它们中的每一个都需要您手动写下带有枚举器和相应处理程序的表。在所有这些中,我更喜欢具有最小间接性的那个,它是普通的 old switch

于 2017-04-15T10:01:33.807 回答