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 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...
随机推荐
- Linux 下编程
关于Linux 下的C语言编译命令和编程要点! https://www.cnblogs.com/wfwenchao/p/3985153.html?utm_source=tuicool&utm_ ...
- 魅族pro 7详细打开Usb调试模式的方法
经常我们使用安卓手机链上Pc的时候,或者使用的有些APP比如我们公司营销小组经常使用的APP引号精灵,之前老版本就需要开启usb开发者调试模式下使用,现经常新版本不需要了,如果手机没有开启usb开发者 ...
- Python常用数据类型
一 .列表 name = ['zhangshan', 'lishi', 'wangwu']# 列表赋值 name.append('liujun')# 增,默认增加到最后位置 name.insert(1 ...
- Excel修改证件照图片背景色
在实际生活中,我们常常需要把白底证件照更改为蓝底或红底.操作步骤只需4步! 工具/原料 Excel 方法/步骤 第1步:插入白底证件照 单击[插入]---[图片],选择图片保存的位置, ...
- Unity3D Button组管理(给按钮的onclick事件“传递参数”)
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; // ...
- 关于MySQL5.7开启bin-log主从复制
主从复制:一般用于实时备份.也可配合mycat,实现读写分离. 传统的基于 ROW的主从复制 简单说下步骤: master主库配置同步,slave从库配置同步,master锁表/备份,slave恢复数 ...
- CSS内嵌样式实现打字效果
<style> *{margin:0;padding:0;} @keyframes typing { from { width: 0; } } @keyframes blink-caret ...
- sdn-准备-虚拟机迁移-vxlan
知识基础: 虚拟机到虚拟机的迁移(Virtual-to-Virtual) V2V 迁移是在虚拟机之间移动操作系统和数据,照顾主机级别的差异和处理不同的虚拟硬件.虚拟机从一个物理机上的 VMM 迁移到另 ...
- reat + cesium。 实现 初始化时自动定位,鼠标移动实时展示坐标及视角高度, 淹没分析
只贴实现淹没分析这块的代码. import styles from './cesium.less'; import React from 'react'; import Cesium from 'ce ...
- 常用oracle可重复执行的脚本模板
为保证脚本的可重复执行以及丢失,涉及到数据库环境的移植等,就会使用可重复执行脚本,此处仅提供相关一些模板 说明下:该脚本需要在命令窗口执行,而不是在SQL窗口执行 创建序的脚本 /** * 作者:zk ...