枚举值依赖函数调用

Enum value dependant function call

本文关键字:函数调用 依赖 枚举      更新时间:2023-10-16

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

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;
}

我想做的是调用根据状态成员中当前值的步骤函数。在步骤((呼叫中,状态不是一个恒定的表达式,这是一个问题。有没有办法编写此枚举依赖的函数调用,而没有大丑陋的开关?

(这只是一个简化的示例,具有一个功能,只有2个状态(。

否,您在使用不是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 s的std::map,但是它们每个人都要求您手动用枚举者和相应的处理程序手动写下表。在所有人中,我更喜欢最小间接的一个,即普通的旧 switch