から派生した基本クラスを定義したいと思います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
は、私が想定している基本クラスのものを「上書き」するのでcuston_reaction
、ハートビートイベントに を派生クラスのリストとして定義する必要があるかもしれません。しかし、このデザインは、このライブラリの設計者がそうあるべきだと考えていたようなものではないかもしれません。
編集
その間、私はいくつかの追加の知識を得ました。の回避策typedef
は、基本クラスではなく派生クラスで定義することです。しかし、その後、奇妙な問題が発生します。基本クラスで定義されているにもかかわらず、コンパイラーはメソッドを見つけられません。他の反応 ( )react (const EvHeartBeat& )
を削除すると、機能します。もちろん、それは私が望んでいることではありません。複数のイベントに反応できるようにしたいのです。react (const OtherEvent& )