2

ブースト msm ですべての状態 (アクティブな状態だけでなく) にアクセスする方法はありますか? たとえば、状態に配置されたすべての UI コントロールは、状態がアクティブかどうかに関係なく、サイズ変更イベントでサイズ変更する必要があります。

更新: 少し明確にさせてください。ステート マシンによって作成されたすべてのオブジェクト状態を介して、ある種のイテレータが必要です。

更新 #2: 以下は例です。すべての状態のサイズ変更メソッドを呼び出す必要があります。

struct EventOne {};
struct EventTwo {};

struct StateOne : public state<> {
    void resize() { }
};

struct StateTwo : public state<> {
    void resize() { }
};

struct MyFsm : public state_machine_def<MyFsm> {
    typedef int no_exception_thrown;
    typedef StateOne initial_state;

    struct transition_table : boost::mpl::vector<
        //      Start,          Event,          Next,           Action,         Guard
        Row<    StateOne,       EventOne,       StateTwo,       none,           none            >,
        Row<    StateTwo,       EventTwo,       StateOne,       none,           none            >
    > {
    };
};

typedef boost::msm::back::state_machine<MyFsm> Fsm;
4

2 に答える 2

4

いくつかの方法があります。1 つは、状態に基底クラスを使用することですが、それは基底クラスであるため、MPL の方法は次のとおりです。

template <class stt>
struct Visit
{
    Visit(Fsm* fsm): fsm_(fsm){}
    template <class StateType>
    void operator()(boost::msm::wrap<StateType> const&)
    {
        StateType& s = fsm_->template get_state<StateType&>();
        s.resize();
    }
    Fsm* fsm_;
};

Fsm f;
typedef Fsm::stt Stt;
// a set of all state types
typedef boost::msm::back::generate_state_set<Stt>::type all_states; //states
// visit them all using MPL
boost::mpl::for_each<all_states,boost::msm::wrap<boost::mpl::placeholders::_1> > (Visit<Stt>(&f));

興味深い質問です。ドキュメントに追加します。

乾杯、クリストフ

PS: これは SO には少し高度すぎます。私は時折SOの訪問者に過ぎないので、ブーストリストの方が速いでしょう。

于 2011-11-30T20:02:41.680 に答える
0

サンプルにはこのサンプルが含まれています

それは(とりわけ?)State Visitor(docs)を使用して州を訪問する方法を示しています

于 2011-11-27T20:30:34.693 に答える