2017-07-19 14 views
0

デフォルト以外のコンストラクタでstate_machine_defとMSM ::フロント::状態を初期化する方法MSM:ブースト::私はこのような状態のマシンを見てい

class FsmDef : public boost::msm::front::state_machine_def<FsmDef> { 
private: 
    Args args; 
    using State = boost::msm::front::state<>; 
public: 
    FsmDef(Args args) : args{args} 
    {} 


    struct InitState {}; 
    struct State1 { 
     Args1 args1; 
     State1(Args1 args1) : args1(args1) 
     {} 
    }; 

    struct transition_table : boost::mpl::vector< 
     boost::msm::front::Row<Init, boost::msm::front::none, State1> 
    > { }; 

    using initial_state = InitState; 
}; 

using Fsm = boost::msm::back::state_machine<FsmDef>; 

Fsm fsm; 

どのように私はfsmを構築してのプライベートデータを初期化することができますがFsmDef。 State1と同じこと。

答えて

1

FsmDefはデフォルトでは構成できません。しかし、State1はデフォルトで構築可能である必要があります。

ここに引数をFsmDefに渡す方法があります。デモhttps://wandbox.org/permlink/ZhhblHFKYWd3ieDK

Fsmboost::msm::back::state_machine<FsmDef>を実行

#include <iostream> 
#include <boost/msm/back/state_machine.hpp> 

#include <boost/msm/front/state_machine_def.hpp> 
#include <boost/msm/front/functor_row.hpp> 

struct Args { 
    int val; 
}; 

class FsmDef : public boost::msm::front::state_machine_def<FsmDef> { 
private: 
    Args args_; 
    using State = boost::msm::front::state<>; 
public: 
    FsmDef(Args args) : args_{args} 
    { 
     std::cout << args_.val << std::endl; 
    } 


    struct InitState : boost::msm::front::state<> {}; 
    struct State1 : boost::msm::front::state<> { 
    // states must be default constructible 
    // Args1 args1; 
    // State1(Args1 args1) : args1(args1) 
    // {} 
    }; 

    struct transition_table : boost::mpl::vector< 
     boost::msm::front::Row<InitState, boost::msm::front::none, State1> 
    > { }; 

    using initial_state = InitState; 
}; 

using Fsm = boost::msm::back::state_machine<FsmDef>; 

int main() { 
    Args a {42}; 
    Fsm fsm(a); 
} 

FsmDefと同じパラメータを持つコンストラクタを持っています。 AFAIK、それは明示的に文書化されていません。

コンストラクタを定義するコードは次のとおりです。

https://github.com/boostorg/msm/blob/boost-1.64.0/include/boost/msm/back/state_machine.hpp#L1625

関連する問題