Как посетить все состояния в (мета) конечного автомата? - PullRequest
2 голосов
/ 28 ноября 2011

Есть ли способ посетить все состояния (не только активные) в надстройке msm?Например, все элементы управления пользовательского интерфейса, помещенные в состояния, должны быть изменены в событии изменения размера независимо от того, активно их состояние или нет.

Обновление: позвольте мне уточнить, мне нужен какой-то итератор для всех объектов-состояний, созданныхмой конечный автомат.

Обновление № 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;

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

У вас есть несколько способов.Можно было бы использовать базовый класс для состояний, но это был бы базовый класс, так что вот способ 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));

Это интересный вопрос, я добавлю его вdoc.

Приветствия, Кристоф

PS: этот вариант слишком продвинут для SO.Это было бы быстрее в списке повышения, поскольку я лишь случайный ТАК посетитель.

0 голосов
/ 28 ноября 2011

Образцы содержат этот образец

Что (среди прочего?) Показывает, как использовать State Visitor ( docs )) посетить штаты

...