statechart::simple_state
から派生した基底クラスを定義したいと思います。これは、それ自体が仮想関数(派生クラスで実装する必要がある)を呼び出す "事前定義"反応を持っています。私が望むのは、いくつかの州は、私の基底クラスから派生するものであれば、特定のイベントに自動的に反応するということです。このよう継承反応
(sc
はboost::statechart
ある):
struct EvHeartBeat : sc::event<EvHeartBeat> {};
template< class MostDerived,
class Context,
class InnerInitial = boost::mpl::list<>,
sc::history_mode historyMode = sc::has_no_history >
class BaseState : public sc::simple_state<
MostDerived, Context, InnerInitial, historyMode >
{
public:
typedef sc::custom_reaction<EvHeartBeat> reactions;
sc::result react (const EvHeartBeat&)
{
// maybe check some conditions here ...
return react_heartbeat();
}
protected:
virtual sc::result react_heartbeat() = 0;
};
そして、導出クラス:
struct MyState :
BaseState<MyState, MyChart>
{
// there are also other reactions
typedef sc::custom_reaction<OtherEvent> reactions;
sc::result react_heartbeat()
{
std::cout << "foo" << std::endl;
}
sc::result react (const OtherEvent&) { /* ... */ }
};
派生クラスでtypedef
は、ベースクラスI内の1つを "上書き" されますおそらく、派生クラスのリストとしてハートビートイベントにcuston_reaction
を定義する必要があるかもしれません。しかし、おそらくこのデザインは、この図書館のデザイナーがそうしなければならないと思ったようなものではありません。一方
EDITは、私はいくつかの追加の知識を得ました。 typedef
の回避策は、基本クラスではなく、派生クラスで定義することです。しかし、奇妙な問題が発生します。他の反応(react (const OtherEvent&)
)を削除すると、コンパイラはreact (const EvHeartBeat&)
のメソッドを見つけません。もちろん、それは私が望むものではなく、私は複数の出来事に反応できるようにしたい。