如何在 Boost::Statechart 中向状态添加 20 多个过渡

How to add more than 20 transitions to a state in Boost::Statechart?

本文关键字:添加 状态 Boost Statechart      更新时间:2023-10-16

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

你的问题实际上与Boost.Statechart无关,而是与Boost.MPL有关,你正在使用它的字体表。来自 Boost.MPL 文档:

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

它继续:

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

因此,大概您在任何#include之前都需要以下内容:

#define BOOST_MPL_LIMIT_LIST_SIZE 30