は、私はここ遷移表としてstd::tr1::tuple
を使用する一般的なステートマシンの独自の実装を持っている:実行時にboost :: fusion :: vectorの要素を見つける方法は?
template<State StartState, Event TriggerEvent, State TargetState>
struct transition {...};
typedef std::tr1::tuple< transition< ready , run , running >
, transition< running , terminate, terminating >
, transition< terminating, finish , terminated >
> transition_table;
機能
template<typename Transitions>
State find_next_state(State current
, Event event
, const Transitions& transition_table);
与えられた遷移表の次の状態を見つけるためにあります現在の状態とイベントが表示されます。
これは、このプラットフォームのtuple
実装が10個以上の項目をサポートしていないことを除いて、すべて正常に動作します。同じことがboost::tuple
についても当てはまると思われますので、代わりにboost::fusion::vector
を採用しようとしています。しかし、それはfusion's find_if
が "unary MPL Lambda Expression"しか取らないように思えます。コンパイル時にのみ動作します。
上記のとおり、find_next_state()
はどのように実装できますか?
注:
これだけGCC 4.1.2を提供するので、我々は、C++ 03 + TR1で立ち往生している独自の組み込みプラットフォーム。
代替作業として、タプルをタプルにパックできますか? – Angew
あなた自身の 'find_if'を書くのはどうですか?これは、実行時にフュージョンシーケンスと関数で動作しますか? – ForEveR
最初に 'tuple'を使うのはなぜですか? 「移行」には何らかの状態がありますか?そうでなければ、 'mpl :: vector'と' mpl :: for_each'を使って実行時に反復処理することができます。 – Abyx