前言
在使用状态机时,在进行状态转换的时候会进行一些相应的操作,包括action,on_entry和on_exit等,这个顺序是比较重要的,在此做一些记录,拯救一下岌岌可危的记性。
范例 自转换
namespace {
class idle;
class test;
struct event1 {};
struct event2 {};
struct event3 {};
struct error_handling {
auto operator()() const {
using namespace sml;
// clang-format off
return make_transition_table(
* state<idle> + event<event3> /[] {std::cout << 2 << std::endl; } = state<test>
, state<idle> + event<event1> /[] {std::cout << 3 << std::endl; }
, state<idle> + on_exit<_> / [] {std::cout << 4 << std::endl; }
, state<idle> + on_entry<_> / [] {std::cout << 5 << std::endl; }
, state<test> + on_entry<_> / [] {std::cout << 6 << std::endl; }
);
// clang-format on
}
};
} // namespace
int main() {
using namespace sml;
sm<error_handling, sml::dispatch<sml::back::policies::jump_table>> sm;
sm.process_event(event1{});
}
关于event1,这是idle状态的自转换,一开始的构想是会先执行idle的on_exit操作,然后再执行event1的action,也就是说输出为4,3 。先看结果如下:
其实是先执行了idle的on_entry 然后执行action,不执行on_exit 。
范例 转换
来看看转换event3的时候的执行顺序。
sm.process_event(event1{});
结果如下
构想与预期一致,只是需要注意的是每次都会调用idle的on_entry操作,这一点需要注意。
执行逻辑如上图所示,一时间没找到画图软件就草草手绘了个。