C++ 状态机接口
最近的状态极差,甚至代码也写不下去了。给自己手臂上的两刀没有任何的作用,看来早已经是麻痹了。
一直想弄一个勉强能用的状态机,用于在各种涉及到状态转换的时候用到,然而脑子并不是太清醒。
先放在这里一个接口,以后会用到的。
状态机主要由3部分组成: 状态,输入,转换。可以在Input中实现状态机的转换蓝图;“状态”可以用枚举来表示。每当存在一个新的状态,那么就需要继承一次下面的接口。
其中的StateStack可以用来做下推自动机,这样可以在状态更新之后,用来还原之前的状态。
如果一个对象拥有多个状态,那么就要用到并发状态机。这个原理大概是,这个对象的成员中存在两个StateBase的子类对象。两者既不相互干扰还能做到同时更新。
UpdateBegin 和 UpdateEnd用来定义状态进出时的行为。但我总觉得,将它放在Input函数中而不是Update函数中更为合适。
C++14的代码,VS2017。
#pragma once
#include <chrono>
#include <stack> #define GetTimeNowMicroSec \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() template<typename TState, typename TIn, typename TTarget>
class StateBase
{
private:
StateBase(); public:
typename std::stack<StateBase<TState, TIn, TTarget>*> StateStack; //Pushdown Automation StateBase(TState st);
virtual ~StateBase(); public:
const TState& GetStateType() const; public:
virtual void Input(TTarget& tag, TIn& input) = ;
virtual void Updating(TTarget& tag) = ; virtual void UpdateBegin(TTarget& tag);
virtual void UpdateEnd(TTarget& tag);
virtual void Update(TTarget& tag); template<class ST,
typename std::enable_if <
std::is_base_of<StateBase, ST>::value, ST
> ::type * = nullptr >>
virtual bool operator==(const ST& left, const ST& right) const
{
return left._st == right._st;
} private:
TState _st;
time_t _time; //micro
}; template<typename TState, typename TIn, typename TTarget>
inline StateBase<TState, TIn, TTarget>::~StateBase()
{
_time = ;
} template<typename TState, typename TIn, typename TTarget>
inline StateBase<TState, TIn, TTarget>::StateBase(TState st):
_st(st)
{
} template<typename TState, typename TIn, typename TTarget>
inline const TState & StateBase<TState, TIn, TTarget>::GetStateType() const
{
return _st;
} template<typename TState, typename TIn, typename TTarget>
inline void StateBase<TState, TIn, TTarget>::UpdateBegin(TTarget & tag)
{
_time = GetTimeNowMicroSec;
} template<typename TState, typename TIn, typename TTarget>
inline void StateBase<TState, TIn, TTarget>::UpdateEnd(TTarget & tag)
{
_time = GetTimeNowMicroSec - _time;
} template<typename TState, typename TIn, typename TTarget>
inline void StateBase<TState, TIn, TTarget>::Update(TTarget & tag)
{
UpdateBegin(tag);
Updating(tag);
UpdateEnd(tag);
}
C++ 状态机接口的更多相关文章
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...
- 探索c#之Async、Await剖析
阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...
- 进阶篇:以IL为剑,直指async/await
接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...
- matplotlib python高级绘图库 一周总结
matplotlib python高级绘图库 一周总结 官网 http://matplotlib.org/ 是一个python科学作图库,可以快速的生成很多非常专业的图表. 只要你掌握要领,画图将变得 ...
- FPGA代码设计规范整理
1.设计中的FIFO.状态机接口需要有异常恢复状态和状态上报机制,格雷码电路防止被综合电路优化掉. a)自行设计的格雷码FIFO(一般用于连续数据流跨时钟域)用Synplify综合时,为了防止被优化需 ...
- python运维开发(二十五)---cmdb开发
内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infr ...
- 读懂IL
读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...
- c#之Async、Await剖析
c#之Async.Await剖析 探索c#之Async.Await剖析 2015-06-15 08:35 by 蘑菇先生, 1429 阅读, 5 评论, 收藏, 编辑 阅读目录: 基本介绍 基本原理剖 ...
- 编写你的第一个 Java 版 Raft 分布式 KV 存储
前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目.该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...
随机推荐
- 使用echart 做出数据折线图
代码如下: // 基于准备好的dom,初始化echarts图表var myChart = echarts.init(document.getElementById("main")) ...
- P3957 跳房子
题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内 ...
- return 返回值
# ### return 返回值 """ (1) return + 数据类型 : 将这个数据弹到函数的调用处,后面除了可以接六大标准数据类型之外,还可以返回类 对象 函数 ...
- 丰富的else语句以及简介的with语句
1.if···else略 2.while.for与else Python中的循环语句(无论是while 还是for)中,经常配合continue和break语句,此时,可以和else搭配使用,当循环正 ...
- mysql 5.7安装图解 mysql 5.7图文安装完整教程
今天给搭建分享一个教程,mysql 5.7的安装操作,这里呢我叫大家怎么用二进制去安装mysql,其实在大多数的生产环境中使用二进制预编译的安装方式是最多了,下面大家跟着我的步骤去尝试着安装下吧. 先 ...
- Docker入门教程
一.入门介绍 Docker是一个开源引擎,类似于一个集装箱,开发者通过它可以为任何应用创建一个轻量级.环境无关可移植的容器.开发者在本地编译测试过的容器可以在不同的环境中部署. 通常适用于如下场景: ...
- python之三级目录
#python之三级目录低配版 menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{ }, 'HP':{ }, '渣打银行':{ }, 'CCTV':{ }, }, '望京': ...
- opendaylight-O版本与openstack集成
feature:list list (Lists all existing features available from the defined repositories) feature:list ...
- iOS 10 Programming Fundamentals with Swift 学习笔记 0
1,a single statement can be broken into multiple lines ,For example, after an opening parenthesis is ...
- mybatis 源码分析一
1.SqlSessionFactoryBuilder public SqlSessionFactory build(InputStream inputStream, String environme ...