我这里有一个专有实现的通用状态机,它使用std::tr1::tuple
作为转移表:
template<State StartState, Event TriggerEvent, State TargetState>
struct transition {...};
typedef std::tr1::tuple< transition< ready , run , running >
, transition< running , terminate, terminating >
, transition< terminating, finish , terminated >
> transition_table;
有一个函数
template<typename Transitions>
State find_next_state( State current
, Event event
, const Transitions& transition_table );
给定当前状态和事件,查找转换表中的下一个状态。
这一切都很好,除了该平台的tuple
实现不支持超过10个项。同样适用于boost::tuple
,因此我正在尝试使用boost::fusion::vector
替代。但似乎fusion的find_if
只接受“一元的MPL Lambda表达式”,我想这只能在编译时工作。
所以,鉴于以上情况,我该如何实现find_next_state()
?
注意:
这是一个专有的嵌入式平台,只提供GCC 4.1.2,因此我们只能使用C++03+TR1。
find_if
函数,使其能够在运行时与融合序列和函数一起使用,这个怎么样? - ForEveRtuple
?transition
有任何状态吗?如果没有,你可以使用mpl::vector
和mpl::for_each
在运行时迭代它。 - Abyxtransition_table
的typedef。如果我这样做,用户需要跳过哪些障碍? - sbifind_next_state()
函数是只有在运行时才知道值的。今天早上我研究了一下,我猜想最好使用 Fusion。当然,我可能错了,这也是我来这里询问的原因。 - sbi