c++ 使用boost-ext::sml调用子状态机构造函数

ix0qys7i  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(232)

我想知道是否有可能使用非默认构造函数来初始化子状态机。我知道有一种方法可以做到:

sub = sml::state<Sub>;

并使用sub即:

auto sub = sml::state<Sub>;
return make_transition_table(
     *"init"_s + event<Start>   / print(data_) = sub
     ,state<Sub> + event<End>  / print(data_) = X
 );

但是,如果Sub语句机有一个非默认构造函数,是否可以使用该构造函数初始化该机器,然后在Composite机器中使用该构造函数?
示例:

struct Sub
{
    Sub(int){}
    auto operator()() const {
        using namespace sml;
        return make_transition_table(
            *"Entry"_s + event<ES1> = X
        );
    }

};

下面是一个例子:https://cpp.godbolt.org/z/zjvWsvscY
完整示例代码:

namespace sml = boost::sml;

struct Context
{
    int x_{};
};

struct Data
{
    int y_{};
};

struct Start{};
struct End{};
struct ES1{};

auto print(Data data)
{
    return [data](Context& ctx) 
    {
        std::cout << "Context: " << ctx.x_ << " data: "<< data.y_ << '\n';
        ++ctx.x_;
    };
}

struct Sub
{
    //Sub(int){}
    auto operator()() const {
        using namespace sml;
        return make_transition_table(
            *"Entry"_s + event<ES1> = X
        );
    }

};


struct Composite
{
    Composite(Data data): data_{std::move(data)}{}
    auto operator()() const {
        using namespace sml;
        auto sub = sml::state<Sub>;
        return make_transition_table(
            *"init"_s + event<Start> / print(data_) = sub
            ,state<Sub> + event<End>  / print(data_) = X
        );
    }

    Data data_;
};

int main()
{
    //Sub sub{};

    Data data;
    Context ctx;
    sml::sm<Composite> sm(Composite{data}, ctx);
    sm.process_event(Start{});
    sm.process_event(ES1{});
    sm.process_event(End{});
    return 0;
}
khbbv19g

khbbv19g1#

假设您可以在初始化Composite的同时初始化Sub,那么您可能能够以与现在完全相同的方式处理它。
下面是一个例子:https://cpp.godbolt.org/z/YKxWzcPza
Sub{someint}添加到sm构造函数:

sml::sm<Composite> sm(Composite{data}, Sub{666}, ctx);

对应的子状态和动作:

auto printSub(int z)
{
    return [z](Context& ctx) 
    {
        std::cout << "Context: " << ctx.x_ << " z: "<< z << '\n';
        ++ctx.x_;
    };
}

struct Sub
{
    Sub(int z): z_{z}{}
    auto operator()() const {
        using namespace sml;
        return make_transition_table(
            *"Entry"_s + event<ES1> / printSub(z_) = X
        );
    }
    int z_;
};

相关问题