如何将boost :: msm状态机的实现扩展/拆分为多个文件?

时间:2018-05-29 14:20:18

标签: c++ boost template-meta-programming state-machine boost-msm

我想将boost :: msm statemachine的实现拆分为多个文件。我正在寻找......:

1)每个国家一个标题

2)主状态机的一个标题(最多的SM) 但我不知道应该如何写这个文件

3)使用SM的客户端代码。

我提出的内容如下(不编译,以下列形式给出错误:“无效使用不完整类型”和其他错误)。

第一个样本状态:

//State1.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;

struct State1:msmf::state<> 
{
    // Entry action
    template <class Event,class Fsm>
    void on_entry(Event const&, Fsm&) const {
        std::cout << "State1::on_entry()" << std::endl;
    }
    // Exit action
    template <class Event,class Fsm>
    void on_exit(Event const&, Fsm&) const {
        std::cout << "State1::on_exit()" << std::endl;
    }
};

第二个样本状态:

//State2.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
struct State2:msmf::state<> 
{
   // Entry action
   template <class Event,class Fsm>
   void on_entry(Event const&, Fsm&) const {
   std::cout << "State2::on_entry()" << std::endl;
   }
   // Exit action
   template <class Event,class Fsm>
   void on_exit(Event const&, Fsm&) const {
        std::cout << "State2::on_exit()" << std::endl;
   }
};

主要SM:

//MyFsm.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>     
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

#include "state1.h"
#include "state2.h"     

namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;

// ----- Events
struct Event1 {};
struct Event2 {};

struct MyFsm_ : msmf::state_machine_def<MyFsm_>
{    
    struct State1;//??? is this the correct way
    struct State2;//???

   // Set initial state
   typedef State1 initial_state;

   // Transition table
   struct transition_table:mpl::vector<
   ...
   >{};
};
// Pick a back-end
typedef msm::back::state_machine<MyFsm_> MyFsm;

客户代码:

//main.h
#include "myfsm.h"

int main()
{
   MyFsm fsm;
   fsm.start();

   fsm.process_event(Event1());
} 

有关如何将boost:msm拆分为多个文件的任何帮助和提示都表示赞赏。

1 个答案:

答案 0 :(得分:3)

您可以使用公共继承将State1和State2引入MyFsm,如下所示:

struct MyFsm_ : msmf::state_machine_def<MyFsm_>
{    
    struct State1_ : State1 {}; // use public inheritance
    struct State2_ : State2 {}; // use public inheritance

   // Set initial state
   typedef State1_ initial_state;

   // Transition table
   struct transition_table:mpl::vector<
         msmf::Row < State1_, Event1, State2_, msmf::none, msmf::none >
   >{};
};

MyFsm_中,使用State1_和State2_而不是State1和State2。

我更新了您的代码,然后就可以了。

这是运行演示: https://wandbox.org/permlink/ZrIVQY38C51fZNFY

您可以看到完整的源代码。该选项卡对应于头文件。最左边的名称具有固定名称prog.cc。通常用于放置int main()