boost::sml 状态机

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"。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"检测到"通常指的是发现或识别到某种情况、事件或物体。它可以用在不同的场景和领域中,下面我将分别说明一些常见的情况。 在科学研究和实验中,人们常常使用各种仪器设备来检测和测量不同的物理特性和化学性质。当仪器显示出某种反应或指示出特定数值时,我们可以说"检测到"了某种物质或属性。例如,当光谱仪显示出特定频率的光谱线时,我们可以说我们"检测到"了该物质的存在。同样地,当pH计显示酸性或碱性时,我们也可以说我们"检测到"了溶液的酸碱性质。 在安全领域,监控摄像头和警报系统可以被用来检测到可疑行为或异常情况。当监控摄像头记录到某人入侵私人领地或发生火灾时,我们可以说系统"检测到"了异常情况。这些设备通过感知视觉、声音或其他感官输入来检测到潜在的威胁,并及时采取行动。 在计算机和网络安全中,恶意软件检测和入侵检测系统广泛应用。当系统检测到某个文件或程序具有恶意代码或有人试图非法入侵系统时,我们可以说系统"检测到"了潜在的威胁。这些系统使用各种技术和算法来分析、检测和阻止恶意行为,以保护计算机和网络的安全。 总之,"检测到"一词常常用于描述通过仪器、设备或系统发现特定物质、属性或情况的过程。无论是在科学、安全还是计算机领域中,"检测到"都是一种重要的功能和过程,可以帮助我们及时发现潜在威胁或问题,并采取相应的措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值