最近的状态极差,甚至代码也写不下去了。给自己手臂上的两刀没有任何的作用,看来早已经是麻痹了。

一直想弄一个勉强能用的状态机,用于在各种涉及到状态转换的时候用到,然而脑子并不是太清醒。

先放在这里一个接口,以后会用到的。

状态机主要由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++ 状态机接口的更多相关文章

  1. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

    作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...

  2. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  3. 进阶篇:以IL为剑,直指async/await

    接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...

  4. matplotlib python高级绘图库 一周总结

    matplotlib python高级绘图库 一周总结 官网 http://matplotlib.org/ 是一个python科学作图库,可以快速的生成很多非常专业的图表. 只要你掌握要领,画图将变得 ...

  5. FPGA代码设计规范整理

    1.设计中的FIFO.状态机接口需要有异常恢复状态和状态上报机制,格雷码电路防止被综合电路优化掉. a)自行设计的格雷码FIFO(一般用于连续数据流跨时钟域)用Synplify综合时,为了防止被优化需 ...

  6. python运维开发(二十五)---cmdb开发

    内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infr ...

  7. 读懂IL

    读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...

  8. c#之Async、Await剖析

    c#之Async.Await剖析 探索c#之Async.Await剖析 2015-06-15 08:35 by 蘑菇先生, 1429 阅读, 5 评论, 收藏, 编辑 阅读目录: 基本介绍 基本原理剖 ...

  9. 编写你的第一个 Java 版 Raft 分布式 KV 存储

    前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目.该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...

随机推荐

  1. Qt笔记之Q_DECLARE_METATYPE(Type)

    首先看一看QVariant这个类,我们可以把它当做一个万能数据类型,需要的时候能转换为一种特定的类型. 使用canConvert()函数检查是否能转换为你想要的数据类型,结构为:bool QVaria ...

  2. python 游戏 —— 汉诺塔(Hanoita)

    python 游戏 —— 汉诺塔(Hanoita) 一.汉诺塔问题 1. 问题来源 问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆 ...

  3. Shell test 命令

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于 ...

  4. ORA-01555快照过旧报错

    一.现象 将数据迁移到新库时,执行较大的存过,会报这个错误. 二.原因 产生该报错的原因: (1)sql执行比较久,需要优化sql (2)回滚段过小 (3)undo保存时间过短 三.具体检查及恢复 1 ...

  5. Beta冲刺 7

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10129067.html 作业博客:https://edu.cnblogs.com/campus ...

  6. mysql 5.7安装图解 mysql 5.7图文安装完整教程

    今天给搭建分享一个教程,mysql 5.7的安装操作,这里呢我叫大家怎么用二进制去安装mysql,其实在大多数的生产环境中使用二进制预编译的安装方式是最多了,下面大家跟着我的步骤去尝试着安装下吧. 先 ...

  7. vim里添加自动补齐插件,与python 函数补齐

    参考  http://www.jb51.net/article/58009.htm 将 # cat ~/.vimrc filetype plugin on let g:pydiction_locati ...

  8. BUAAOO P1-P3 Expression Dirivation

    目录 1.问题描述 1.1.概念定义 7.程序度量 8.知识点笔记 1.运行 2.1.方法 2.2.检测相等性 2.3.空串与null串 2.4.使用StringBuilder构建字符串 2.5.使用 ...

  9. 分频器的Verilog实现

    一.占空比50%的奇数分频 1.实现思路 实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1:用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频 ...

  10. Consider defining a bean of type 'com.lvjing.dao.DeviceStatusMapper' in your configuration.

    "C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBra ...