Я нашел эту ссылку во время поиска в Google после того, как набрал свое предложение ниже, в котором говорится, что то, что вы уже делаете (публикуете внутреннее событие или публикуете событие с данными), является способ сделать это. И это от автора Boost Statechart, так кто же будет спорить? :)
Мое альтернативное предложение заключается в том, что если какие-либо ваши данные существуют на уровне «Проект» после загрузки, тогда загружаемое имя файла будет частью информации о состоянии FSM, на уровне «Проект», а не «Загружен». "состояние.
Вы можете сделать имя файла параметром события / конструктора EvLoad, выполняя пользовательское действие при переходе и сохраняя имя файла, которое загружается в контексте «Проект». Я думаю, что это лучше подходит для концепций диаграммы состояний.
Итак, что-то вроде этого (хотя я не проверял это), и, очевидно, вы бы очистили его, чтобы лучше инкапсулировать членов:
struct EvLoad: sc::event<EvLoad>
{
std::string filename;
EvLoad(const std::string& fn) : filename(fn) {}
};
struct EvUnload: sc::event<EvUnload>
struct Project : sc::state_machine<Project, Unloaded>
{
std::string filename;
void LoadFile(const EvLoad& e)
{
// Load file
filename = e.filename;
}
void UnloadFile(const EvUnload& e)
{
filename.clear();
// Unload file data
}
};
struct Unloaded : sc::simple_state<Unloaded, Project>
{
typedef sc::transition<EvLoad, Loaded, Project, &Project::LoadFile> reactions;
};
struct Loaded : sc::simple_state<Loaded, Project>
{
typdef mpl::list<
sc::transition<EvLoad, Loaded, Project, &Project::LoadFile>,
sc::transition<EvUnload, Unloaded>
> reactions;
};
Когда вы собираетесь загрузить файловый диск, машина состояний с помощью вызова, такого как project.process_event (EvLoad (filename));
В качестве альтернативы вы можете просто сохранить имя файла в состоянии «Проект» и получить к нему доступ через context (). Filename из состояния Loaded.