С помощью 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, Кристоф

Другие вопросы по тегам