я здесь фирменную реализацию общей государственной машины, которая использует 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', который будет работать с последовательностью fusion и функцией во время выполнения? – ForEveR
Почему вы используете 'tuple' в первую очередь? Есть ли у «перехода» какое-либо состояние? Если это не так, вы можете использовать 'mpl :: vector' и' mpl :: for_each', чтобы перебирать его во время выполнения. – Abyx