1

我不得不承认我对 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;
}
4

1 回答 1

3

您的问题实际上与 Boost.Statechart 无关,而是与您正在使用其类型列表的 Boost.MPL 相关。来自Boost.MPL 文档

BOOST_MPL_LIMIT_LIST_SIZE是一个可覆盖的配置宏,用于调节list' 和list_c' 的可变参数形式的最大数量。在这个库的实现中,BOOST_MPL_LIMIT_LIST_SIZE默认值为 20。

它继续:

要覆盖默认限制,请在包含任何 library header 之前BOOST_MPL_LIMIT_LIST_SIZE定义所需的最大数量,四舍五入到最接近的十的倍数。

所以大概你会在任何#includes 之前想要以下内容:

#define BOOST_MPL_LIMIT_LIST_SIZE 30
于 2012-05-07T22:00:13.680 回答