Ich habe hier eine proprietäre Implementierung eines generischen Zustandsmaschine, die ein std::tr1::tuple
als Übergangstabelle verwendet:Wie finde ich ein Element in einem boost :: fusion :: vector zur Laufzeit?
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;
Es gibt eine Funktion
template<typename Transitions>
State find_next_state(State current
, Event event
, const Transitions& transition_table);
den nächsten Zustand in der Übergangstabelle eines bestimmten zu finden aktueller Zustand und ein Ereignis.
Dies funktioniert alles gut, außer für die tuple
Implementierung dieser Plattform, die nicht mehr als 10 Elemente unterstützt. Das gleiche scheint für boost::tuple
zu gelten, also versuche ich stattdessen boost::fusion::vector
zu verwenden. Aber es scheint, fusion's find_if
nimmt nur "eine unäre MPL Lambda Expression" - das, ich nehme an, funktioniert nur zur Kompilierzeit.
Also die oben genannten, wie kann ich find_next_state()
implementieren?
Hinweis:
Dies ist eine proprietäre Embedded-Plattform, die nur GCC 4.1.2, so dass wir stecken mit C++ 03 + TR1 liefert.
Als Alternative Workarond, könnten Sie vielleicht Tupel in Tupel verpacken? – Angew
Wie wäre es mit einem eigenen 'find_if', der zur Laufzeit mit Fusions-Sequenz und -Funktion arbeitet? – ForEveR
Warum verwenden Sie 'tuple' an erster Stelle? Hat "Übergang" einen Zustand? Wenn nicht, können Sie die 'mpl :: vector' und' mpl :: for_each' verwenden, um in der Laufzeit darüber zu iterieren. – Abyx