

Boost.Statechart を使っているのですが、遷移元の状態がいくつかある場合、前の状態に戻る簡単な方法はないでしょうか？

どの状態から入ってきたのかを自前で覚えておけば出来るのですが、もっとよい方法があればお教え頂けませんでしょうか？


CC BY-SA 3.0
2015-02-19T06:18:01.543
6735
2015-02-22T08:46:02.067
2015-02-19T07:10:18.427
4978
5081
question
c++ boost state-machines boost-statechart
Boost.Statechart でひとつ前の状態に戻るには


状態遷移図は有向グラフですから、"一つ前の状態"に戻るには逆向きの状態遷移が定義されている必要があります。逆遷移が定義されない場合は、そもそも状態遷移のルールに反します。

Boost.Statechartは状態遷移を表現する汎用フレームワークですから、それ自身は例外的機能を提供しないと思います。


CC BY-SA 3.0
2015-02-22T05:19:16.863
6907
2015-02-22T05:19:16.863
49
6735
answer


`boost::statechart` ライブラリは使ったことがありませんので、より詳しい方が現れるまでのつなぎとしてご覧いただければと思います。

[Boost::statechart
Tutorial](http://www.boost.org/doc/libs/1_57_0/libs/statechart/doc/tutorial.html)  
上記、英語になりますが情報としては新しいです。

[Boost ライブラリの FSM チュートリアル
日本語版](http://jaist.dl.sourceforge.jp/jyugem/7127/fsm-tutorial-jp.pdf)  
上記 PDF は日本語訳が結構適当ですが…。  
チュートリアルのソースコード上は FSM なので名前が変わる前…もう10年程前です。  
ただ、英語に不慣れな方でも感じはつかめると思いますのでリンクは残しておきます。

チュートリアル資料に、 **History** または **履歴** といった項目がありました。

例えば `simple_state` の宣言は以下の通りとなっています。

[code]

    template< class MostDerived,
              class Context,
              class InnerInitial = mpl::list<>,
              history_mode historyMode = has_no_history >
    class simple_state : public detail::simple_state_base_type< MostDerived,
      typename Context::inner_context_type, InnerInitial >::type
    
[/code]

テンプレートパラメータの `history_mode` に以下の enum のどれかを渡すことができます。

[code]

    enum history_mode
    {
      has_no_history,
      has_shallow_history,
      has_deep_history,
      has_full_history // shallow & deep
    };
    
[/code]

それぞれの shallow, deep, full の違いが上記チュートリアルからは、いまいち読み取れなかったです、申し訳ありません。

[状態履歴を無効化できるかどうか](http://www.boost.org/doc/libs/1_57_0/libs/statechart/doc/faq.html#DisableHistory)
という FAQ も掲載されていますので、併せてご確認ください。(動的に無効化できるかどうかなので本題とは、ずれます)


CC BY-SA 3.0
2015-02-22T08:38:54.247
6915
2015-02-22T08:46:02.067
2015-02-22T08:46:02.067
7926
7926
6735
answer