【问题标题】:How to visit all states in (boost meta) state machine?如何访问(增强元)状态机中的所有状态?
【发布时间】:2011-11-27 20:18:54
【问题描述】:

有没有办法访问 boost msm 中的所有状态(不仅是活动状态)? 例如。放置在状态中的所有 UI 控件都应在调整大小事件上调整大小,无论其状态是否处于活动状态。

更新: 让我澄清一下,我需要某种迭代器来遍历我的状态机创建的所有对象状态。

更新 #2: 下面是一个例子。我需要调用所有状态的resize方法。

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;

【问题讨论】:

  • Boost MSM 是高度通用的,没有关于您的特定状态类(以及更多)的信息,就不可能提供有针对性的答案

标签: c++ boost boost-msm


【解决方案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 访问者,所以在 boost list 上会更快。

【讨论】:

  • 哇,我已经得到了作者的答案。非常感谢克里斯托夫!
【解决方案2】:

样本包含此样本

这(除其他外?)展示了如何使用国事访问者 (docs) 访问各州

【讨论】:

  • 嗯,我读了很多这些文档。并在问这个问题之前再次检查了它们。您确定要访问非活动状态吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2019-09-15
  • 1970-01-01
  • 2016-08-07
  • 2017-06-22
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多