С помощью boost::msm eUML, если я даю attribute_ << конечному автомату или состоянию, как я (пере) устанавливаю их?
Если я добавлю атрибуты к событию, я знаю, что затем смогу использовать имя события как функцию...
BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(*someEvent*, *someAttributeList*)
someStateMachine.process_event(
someEvent (
valueOfSomeAttribute1, // sets the attribute value here
valueOfSomeAttribute2))
и что внутри действия я могу это обратно, написав
evt.get_attribute(someAttribute1); // retrieve the attribute value
Теперь, если я установлю атрибут для всей машины, вот так:
BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
init_ << initState,
Entry_Action,
Exit_Action,
attributes_ << someAttribute1 << someAttribute2,
configure_<< someConfigurationStuff ),
newStateMachineType)
Как мне установить значение для someAttribute1?
Тот же вопрос для государств:
BOOST_MSM_EUML_STATE(
(someEntryAction,
someExitAction,
attributes_ << someAttribute1,
configure_<< someConfigurationStuff)
,newStateName)
Как мне установить значение для someAttribute1?
В заключение,
Есть ли способ изменить атрибуты после создания объекта?
Например, я хотел бы иметь атрибут для конечного автомата, и в одном из моих состояний запомнить некоторую часть информации, которую я могу сохранить в конечном автомате. (В этом случае я хочу сохранить сокет.)
Благодарю.
1 ответ
Как мне установить значение для someAttribute1? Вы можете:
- измените только что полученную ссылку (get_attribute возвращает ссылку): ++evt.get_attribute(someAttribute1).
- используйте функторы, чтобы записать атрибут в вашу таблицу напрямую. Например, возможно следующее действие: /++fsm_(someAttribute1)
Для штатов вы можете сделать то же самое. А для конечных автоматов, ну так же. Опять же, вы можете использовать параметр шаблона Fsm в своих действиях или функторы (fsm_, event_ и т. Д.)
Вы можете найти хороший пример всего в примерах или тестах (например, test/CompositeEuml.cpp или test / AnonymousEuml.cpp).
HTH, Кристоф