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

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

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

状态机主要由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);
}

最新文章

  1. 让BASH,VIM美美的Powerline
  2. iOS6新特征:UICollectionView介绍
  3. ASP.NET MVC 学习笔记(一)
  4. iOS—网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据
  5. Codeforces Round #371 (Div. 2) - B
  6. BZOJ1565: [NOI2009]植物大战僵尸
  7. 扩展Date的format方法--格式化日期时间
  8. C语言中文件的读取和写入
  9. 4.html5中超链接
  10. android布局太深导致的 java.lang.StackOverflowError
  11. Javascript 常用代码总结
  12. 输出1到最大的N位数
  13. Eclipse添加Web和java EE插件
  14. 蓝桥杯 C语言 入门训练 序列求和
  15. MVC视图路径修改方法
  16. Node.js系列-express(上)
  17. ZOJ_2314_Reactor Cooling_有上下界可行流模板
  18. Python第二章(北理国家精品课 嵩天等)
  19. Intellij IDEA junit 使用之org.junit不存在
  20. go语言template包中模板语法总结

热门文章

  1. 第十三次作业——回归模型与房价预测&amp;第十一次作业——sklearn中朴素贝叶斯模型及其应用&amp;第七次作业——numpy统计分布显示
  2. json的xpath:简易数据查询
  3. CentOS系统Nginx安装配置,随时更新
  4. [转载] java多线程总结(二)
  5. IPC 简说
  6. Python_02
  7. L2-002 链表去重 (25 分)
  8. IDEA创建简单SpringBoot项目
  9. liunx centOS6.5安装jdk教程
  10. shell 之扫描ip段