我想知道是否有可能使用非默认构造函数来初始化子状态机。我知道有一种方法可以做到:
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;
}
1条答案
按热度按时间khbbv19g1#
假设您可以在初始化
Composite
的同时初始化Sub
,那么您可能能够以与现在完全相同的方式处理它。下面是一个例子:https://cpp.godbolt.org/z/YKxWzcPza
将
Sub{someint}
添加到sm
构造函数:对应的子状态和动作: