在C++中实现有限状态机的最佳方法是什么
What's the best way of implementing a finite state machine in C++
我见过许多实现FSM的不同方法。
切换实例函数指针表面向对象编程
我的问题是,在选择一种实现而不是另一种实现时,我应该注意的主要因素是什么。在我的例子中,我只有4个状态,每个状态最多有2个转变。我的主要目标是使实现易于阅读,便于其他人修改。
谢谢
请看基于方法的FSA实现
// abstract FSA
template<class C, typename T>
struct fsa {
struct state_t {
typedef state_t (C::*type)(T);
inline state_t(type f) : state(f) {}
type state;
};
fsa(state_t init) : state(init) {}
inline bool next(T val) {
state = (static_cast<C*>(this)->*state.state)(val);
return state.state != nullptr;
}
private:
state_t state;
};
//concrete FSA implementation
struct myfsa : fsa<myfsa,char> {
inline myfsa() : fsa<myfsa, char>(&myfsa::start) {}
state_t start(char) {
std::cout << "start" << std::endl;
return &myfsa::state1;
}
state_t state1(char) {
std::cout << "state1" << std::endl;
return &myfsa::state2;
}
state_t state2(char) {
std::cout << "state2" << std::endl;
return nullptr;
}
char get() { return ' '; /*TODO*/ }
void run() {
while(next(get()));
}
};
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?