我這裏有一個專有實現一個通用的狀態機,它使用一個std::tr1::tuple
作爲過渡表:如何在運行時在boost :: fusion :: vector中查找元素?
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's find_if
只需要「一個一元MPL Lambda Expression」 - 我想,這隻能在編譯時工作。
因此,鑑於上述情況,我如何實施find_next_state()
?
注:
這是一個專用的嵌入式平臺,僅提供GCC 4.1.2,所以我們堅持用C++ 03 + TR1。
作爲另一種工作方式,也許你可以將元組打包到元組中? – Angew
如何編寫自己的'find_if',它將在運行時與融合序列和函數一起使用? – ForEveR
爲什麼你首先使用'tuple'? 「過渡」有沒有任何狀態?如果沒有,你可以使用'mpl :: vector'和'mpl :: for_each'在運行時迭代它。 – Abyx