3

在 boost::msm 的教程中,有一个例子展示了我们如何检查当前状态。

    // Transition table for player
    struct transition_table : mpl::vector<
        //      Start     Event         Next      Action               Guard
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < Stopped , play        , Playing , &p::start_playback                         >,
        a_row < Stopped , open_close  , Open    , &p::open_drawer                            >,
        a_row < Stopped , stop        , Stopped , &p::stopped_again                          >,
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < Open    , open_close  , Empty   , &p::close_drawer                           >,
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < Empty   , open_close  , Open    , &p::open_drawer                            >,
        a_row < Empty   , cd_detected , Stopped , &p::store_cd_info                          >,
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < Playing , stop        , Stopped , &p::stop_playback                          >,
        a_row < Playing , pause       , Paused  , &p::pause_playback                         >,
        a_row < Playing , open_close  , Open    , &p::stop_and_open                          >,
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < Paused  , end_pause   , Playing , &p::resume_playback                        >,
        a_row < Paused  , stop        , Stopped , &p::stop_playback                          >,
        a_row < Paused  , open_close  , Open    , &p::stop_and_open                          >,
        //    +---------+-------------+---------+---------------------+----------------------+
        a_row < AllOk   , error_found ,ErrorMode, &p::report_error                           >,
        a_row <ErrorMode,end_error    ,AllOk    , &p::report_end_error                       >
        //    +---------+-------------+---------+---------------------+----------------------+
    > {};

    // Replaces the default no-transition response.
    template <class FSM,class Event>
    void no_transition(Event const& e, FSM&,int state)
    {
        std::cout << "no transition from state " << state
            << " on event " << typeid(e).name() << std::endl;
    }
};
// Pick a back-end
typedef msm::back::state_machine<player_> player;

//
// Testing utilities.
//
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused","AllOk","ErrorMode" };

void pstate(player const& p)
{
    // we have now several active states, which we show
    for (unsigned int i=0;i<player::nr_regions::value;++i)
    {
        std::cout << " -> " << state_names[p.current_state()[i]] << std::endl;
    }
}

作者使用数组state_names。但是我没有找到如何确定状态顺序的解释。当然我可以猜到它是转换表的“开始”列中的状态顺序。但是,如果某些州不在“开始”列中怎么办?

4

1 回答 1

1

这在 MSM 文档(第 6 章。内部,生成的状态 ID)中进行了解释。该顺序是人们所期望的 - 转换表中源状态的相应顺序,然后是目标状态的相应顺序。

于 2013-07-23T22:39:29.603 回答