1

私はC++とBoostステートチャートにかなり慣れていないことを認めなければなりません。Statechartライブラリで少し遊んで、「より大きな」ステートマシンを構築したいと思いました。

私の問題の非常に簡単な例を挙げます。状態が1つだけで、自己遷移が多いステートマシンを想定します。そのようなものを構築する方法は?20を超える遷移はすべて、gcc(4.5.2)コンパイラによって拒否されます(「テンプレート引数の数が間違っています(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'sおよびlist_c'の可変個引数形式の最大アリティを調整するオーバーライド可能な構成マクロです。このライブラリの実装でBOOST_MPL_LIMIT_LIST_SIZEは、デフォルト値は20です。

それは続く:

デフォルトの制限を上書きするには、ライブラリヘッダーを含める前にBOOST_MPL_LIMIT_LIST_SIZE、10の最も近い倍数に切り上げられた目的の最大アリティに定義します。

#includeしたがって、おそらく、 sの前に次のものが必要になります。

#define BOOST_MPL_LIMIT_LIST_SIZE 30
于 2012-05-07T22:00:13.680 に答える