接触了boost库里的sml,该状态机很好用,很多用法也挺全的,在这里补充一下子状态机的用法,适用于模块化处理,尤其在错误处理的情况下,如果每个状态都单独指向错误状态会很麻烦,最好是整个子状态机都可以指向错误状态,也方便回溯。
也很好的做了分割,功能上看得更清晰。
namespace {
struct e1 {};
struct e2 {};
struct e3 {};
struct e4 {};
struct e5 {};
struct sub {
auto operator()() const noexcept {
using namespace sml;
// clang-format off
return make_transition_table(
*"idle"_s + event<e3> / [] { std::cout << "in sub sm" << std::endl; } = "s1"_s
, "s1"_s + event<e4> / [] { std::cout << "finish sub sm" << std::endl; } = X
);
// clang-format on
}
};
struct composite {
auto operator()() const noexcept {
using namespace sml;
// clang-format off
return make_transition_table(
*"idle"_s + event<e1> = "s1"_s
, "s1"_s + event<e2> / [] { std::cout << "enter sub sm" << std::endl; } = state<sub>
, state<sub> + event<e5> / [] { std::cout << "exit sub sm" << std::endl; } = X
);
// clang-format on
}
};
} // namespace