0

我有一个看起来像这样的状态机:

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;

如何fsmFsmDef. State1 也一样。

4

1 回答 1

3

FsmDef可以是非默认可构造的。但State1需要默认可构造。

这是一种将参数传递给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);
}

运行演示https://wandbox.org/permlink/ZhhblHFKYWd3ieDK

Fsm,boost::msm::back::state_machine<FsmDef>具有与 具有相同参数的构造函数FsmDef。AFAIK,它没有明确记录。

这是定义构造函数的代码。

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

于 2017-07-22T23:51:46.650 回答