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 に答える