【问题标题】:How to add more than 20 transitions to a state in Boost::Statechart?如何在 Boost::Statechart 中为一个状态添加 20 多个转换?
【发布时间】:2012-05-07 21:54:50
【问题描述】:

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

【问题讨论】:

    标签: c++ gcc boost boost-statechart


    【解决方案1】:

    您的问题实际上与 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 定义为所需的最大数量,向上舍入到最接近的十的倍数在包含任何库头之前

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

    #define BOOST_MPL_LIMIT_LIST_SIZE 30
    

    【讨论】:

    • 当然,确保在任何地方都正确定义它的简单方法是将-DBOOST_MPL_LIMIT_LIST_SIZE=30 添加到编译器的命令行中,在 makefile 的适当位置(或您用来构建项目)。并确保如果您使用的是预编译的标头,当您更改值时它们会重新构建。
    • @Michael :同意,对于非平凡的用例,-D 确实是超越#define 的方法。
    • 感谢您的帮助!我还必须添加 BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS makro。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多