如何在Boost :: Statechart中向一个状态添加20多个转换?

时间:2012-05-07 21:54:51

标签: c++ gcc boost boost-statechart

我不得不承认我对C ++和Boost Statecharts很陌生。我在Statechart库中玩了一下,想要构建一些“更大”的状态机。

我举一个非常简单的问题例子。让我们假设一个状态机只有一个状态和很多自转换。如何构建这样的东西? gcc(4.5.2)编译器拒绝了20个转换之上的所有内容(“错误的模板参数数量(21,应为20)”)

以下是一些示例代码:

#include <boost/statechart/event.hpp>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/transition.hpp>
#include <iostream>
#include <boost/mpl/list.hpp>
namespace sc = boost::statechart;

struct MyEvent1: sc::event<MyEvent1> {};
struct MyEvent2: sc::event<MyEvent2> {};
//...
struct MyEvent21: sc::event<MyEvent21> {};

struct MyState;
struct Statemachine: sc::state_machine<Statemachine, MyState> {};

struct MyState: sc::simple_state<MyState, Statemachine> {
    typedef boost::mpl::list<
            sc::transition< MyEvent1, MyState >  , 
            sc::transition< MyEvent2, MyState > , 
            //...
            sc::transition< MyEvent21 >     
    > reactions;
};

int main() {
    //..
    return 0;
}

1 个答案:

答案 0 :(得分:2)

你的问题实际上与Boost.Statechart无关,而是Boost.MPL,你正在使用它的类型列表。来自Boost.MPL docs

  

BOOST_MPL_LIMIT_LIST_SIZE是一个可覆盖的配置宏,用于调整listlist_c的可变形式的最大值。在库的此实现中,BOOST_MPL_LIMIT_LIST_SIZE的默认值为20.

它继续:

  

要覆盖默认限制,请在包含任何库标题之前,将BOOST_MPL_LIMIT_LIST_SIZE定义为所需的最大arity四舍五入到最接近的十个的倍数。

所以大概在任何#include之前你都需要以下内容:

#define BOOST_MPL_LIMIT_LIST_SIZE 30