boost::statechart を学習しようとしています。
ファイルをロードする小さなアプリを作りたいです。
// --------------------------------
// | |
// | O Project |
// | | |
// | v |
// | ---------------------------- |
// | | | |
// | | Unloaded | |
// | ---------------------------- |
// | | ^ |
// | | EvLoad | EvUnload |<-----O
// | v | |
// | ---------------------------- |
// | | | |
// | | Loaded | |
// | ---------------------------- |
// | | ^ |
// | | | EvLoad |
// | ----- |
// --------------------------------
しかし、ファイル名などの引数を状態に転送するにはどうすればよいですか? ファイル名を EvLoad 内に保存すると、状態反応のために簡単にアクセスできます
struct Loaded : sc::simple_state< Loaded, Project>
{
typedef sc::custom_reaction< EvLoad > reactions;
sc::result react( const EvLoad & e )
{
//load file e.path()
...
return discard_event();
}
}
しかし、Unloaded 状態のときは、Loaded のコンストラクターを呼び出しており、それに引数を渡すことができません。私が思いついた唯一の回避策は、移行を行う前にイベントを再投稿することですが、これは少し汚いように見えます。
struct Unloaded : sc::simple_state< Unloaded, Project >
{
typedef sc::custom_reaction< EvLoad > reactions;
sc::result react( const EvLoad & e )
{
post_event( e ); //workaround to pass the event to the loaded state
return transit<Loaded>();
}
};
より良い代替手段はありますか?