我已经看到了许多实施FSM的不同方法。
切换情况下的 函数指针表 面向对象编程
我的问题是,在选择一种实施方案时,我应该注意哪些主要因素。在我的情况下,我只有4个状态,每个状态最多有2个转换。我的主要目标是让其他人可以轻松阅读实现。
由于
答案 0 :(得分:0)
请查看method-based 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()));
}
};