有限状态机,boost::msm

一个简单的有限状态机如图所示:

这个状态机有两个,State1状态,和结束状态。

下列代码可以描述这个状态机:

#include <iostream>
#include <boost/msm/back/state_machine.hpp>

#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

namespace {
    namespace msm = boost::msm;
    namespace msmf = boost::msm::front;
    namespace mpl = boost::mpl;

    // ----- Events
    struct Event1 {};

    // ----- State machine
    struct Sm1_:msmf::state_machine_def<Sm1_>
    {
        // States
        struct State1:msmf::state<>
        {
            // Entry action
            template <class Event,class Fsm>
            void on_entry(Event const&, Fsm&) const {
                std::cout << "State1::on_entry()" << std::endl;
            }
            // Exit action
            template <class Event,class Fsm>
            void on_exit(Event const&, Fsm&) const {
                std::cout << "State1::on_exit()" << std::endl;
            }
        };
        struct End:msmf::terminate_state<> {};

        // Set initial state
        typedef State1 initial_state;

        // Transition table
        struct transition_table:mpl::vector<
            //          Start   Event   Next    Action      Guard
            msmf::Row < State1, Event1, End,    msmf::none, msmf::none >
        > {};
    };

    // Pick a back-end
    typedef msm::back::state_machine<Sm1_> Sm1;

    void test()
    {
        Sm1 sm1;
        sm1.start();
        std::cout << "> Send Event1" << std::endl;
        sm1.process_event(Event1());
    }
}

int main()
{
    test();
    return 0;
}
// Output:
//
// State1::on_entry()
// > Send Event1
// State1::on_exit()

Sm1_ 对象表示这个状态机. 在 Sm1_状态机中有两个state,分别为:State1和End. 初始伪状态通过如下语句定义:

 // Set initial state
 typedef State1 initial_state;

typedef xxx initial_state 表示状态机Sm1_从状态State1开始。

尊重原作,原文链接,mark备用

时间: 2024-10-21 07:01:06

有限状态机,boost::msm的相关文章

Important Programming Concepts (Even on Embedded Systems) Part V: State Machines

Earlier articles in this series: Part I: Idempotence Part II: Immutability Part III: Volatility Part IV: Singletons Oh, hell, this article just had to be about state machines, didn’t it? State machines! Those damned little circles and arrows and q’s.

所有的 Boost 库文档的索引

按字母顺序列出的库 按类别列出的库 算法 破碎的编译器的解决方法 并发编程 容器 正确性和测试 数据结构 特定于域的 函数对象和高阶编程 泛型编程 图像处理 输入/输出 跨语言支持 迭代器 语言功能仿真 数学和数字 内存 解析 模式和习语 预处理器元编程 编程接口 状态机 字符串和文本处理 系统 模板元编程 杂项 图书馆从提高退休 请参阅入门页面以了解如何下载. 构建和安装库. 按字母顺序列出的库 蓄能器-增量计算和统计累加器,Eric Niebler 从集合框架 算法-有用的通用算法,从马歇尔

C++ Boost库分类总结

c# 程序员写c++,各种不适应.尤其是被内存操作和几十种字符串类型的转换,简直疯了,大小写转换竟然要手动写代码实现. Boost看介绍不错,也不知道能不能跨平台.过几天要上linux写c++, 也不知道这东西能不能用. 转自: https://blog.csdn.net/svap1/article/details/80496489 按照实现的功能,Boost可为大致归入以下20个分类,在下面的分类中,有些库同时归入几种类别.字符串和文本处理库 a) Conversion库:对C++类型转换的增

mac下编译 boost编译工具b2

cd boost_1_64_0/tools/build ./bootstrap.sh --with-toolset=gcc 输出: -n Bootstrapping the build engine with toolset gcc... engine/bin.macosxx86_64/b2 Bootstrapping is done. To build and install, run: ./b2 install --prefix=<DIR> ./b2 install --prefix=/u

几种有限状态机的实现

有限状态机,除了可以组织游戏逻辑之外,还可以用于实现简单的AI.实现有限状态机的方法有很多,大多数是跨语言的,也有几种依赖MonoBehaviour的. 传统的FSM https://gamedevelopment.tutsplus.com/tutorials/finite-state-machines-theory-and-implementation--gamedev-11867 在这篇文章中,介绍了两种FSM的实现方法.第一种是这样的: public class FSM { private

10 C++ Boost ASIO网路通信库 TCP/UDP,HTTP

  tcp 同步服务器,显示服务器端时间 tcp 同步服务器,提供多种选择 多线程的tcp 同步服务器 tcp 同步客户端 boost 域名地址解析 tcp异步服务器 tcp 异步客户端 UDP同步服务器 UDP同步客户端 UDP异步服务器 UDP异步客户端 HTTP同步客户端 HTTP异步客户端 同步实验: 异步实验 多线程异步实验 tcp 同步服务器,显示服务器端时间 [email protected]:~/boost$ cat main.cpp  #include <ctime> #in

Boost学习笔记(三) progress_timer

progress_timer也是一个计时器,它继承自timer,会在析构时自动输出时间,省去timer手动调用elapsed()的工作,是一个用于自动计时相当方便的小工具. #include <boost\timer.hpp> #include <boost\progress.hpp> #include <iostream> using namespace boost; using namespace std; int main() { boost::progress_

有限状态机VHDL模板

逻辑设计, 顾名思义, 只要理清了逻辑和时序, 剩下的设计就是做填空题了. 简单总结了有限状态机的一种设计方式, 详细参见 <<Circuit Design with VHDL>>  chapter 8  State Machines 1  有限状态机 2  VHDL模板之一 1)  端口定义 library IEEE; use ieee.std_logic_1164.all; --! 端口定义 entity <entity_name> is port ( INPUT

Boost练习程序(multi_index_container)

代码来自:http://blog.csdn.net/whuqin/article/details/8482547 该容器能实现多列索引,挺好. #include <string> #include <iostream> #include <boost/multi_index_container.hpp> #include <boost/multi_index/member.hpp> #include <boost/multi_index/ordered