boost::sml 状态机

文章介绍了如何利用boost库中的sml工具来创建状态机。示例展示了两个状态(state1和state2)以及两个事件(event1和event2)之间的转换,并提到了on_entry和on_exit回调函数在状态切换时的作用。在main函数中,通过处理event1和event2事件来触发状态转换,并在转换时执行相应的动作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

boost::sml
最近接触了一些状态机的东西,发现这个确实蛮方便的,已经在boost库里写好了,记录一下。
举个例子先

#include <iostream>
#include <boost/sml.hpp>

namespace sml = boost::sml;

struct state1 {
  void operator()() const { std::cout << "Entering state1\n"; }
  void on_exit() const { std::cout << "Exiting state1\n"; }
};

struct state2 {
  void operator()() const { std::cout << "Entering state2\n"; }
  void on_exit() const { std::cout << "Exiting state2\n"; }
};

struct event1 {};
struct event2 {};

auto transition_table = sml::make_transition_table(
  sml::state<state1> + sml::on_entry<_> / [] { std::cout << "Entering state1 with any event\n"; } = sml::state<state2>,
  sml::state<state2> + sml::on_entry<_> / [] { std::cout << "Entering state2 with any event\n"; } = sml::state<state1>
);

int main() {
  sml::sm<decltype(transition_table)> sm;  // 声明一个状态机,使用上文所写的transition table作为依据
  sm.process_event(event1{});
  sm.process_event(event2{});
}

以上涉及了on_exit()和on_entry(),意思分别是刚进入/刚离开该状态时会采用的action。
在此补充一个概念:
state – 是一个类,系统处于某一特定的状态下。
event – 是一个结构体,是一个信号触发器,代表状态发生改变。
guard – 用于确定是否发生状态转换。
action – 转换发生时所执行的函数或方法。

上述代码所描述的状态机有两个状态:state1和state2,有两个event:event1和event2。

流程如下:
main()中,使用sm.process_event(event1{});,将event1作为参数并以此为依据进行状态转换。
在transition table中,从state1这个状态,由event1触发,开始转换到state2状态。当转移发生时,执行on_entry这个action,这个action内联了一个lambda表达式,输出"Entering state1 with any event\n"。

就先写到这里,回头再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值