c++ - 通过转换 boost 状态图传递参数

标签 c++ boost boost-statechart statechart

我正在尝试学习 boost::statechart。

我想制作一个加载文件的小应用。

//  --------------------------------
// |                                |
// |           O     Project        |
// |           |                    |
// |           v                    |
// |  ----------------------------  |
// | |                            | |
// | |         Unloaded           | |
// |  ----------------------------  |
// |  |              ^              |
// |  | EvLoad       | EvUnload     |<-----O
// |  v              |              |
// |  ----------------------------  |
// | |                            | |
// | |         Loaded             | |
// |  ----------------------------  |
// |           |   ^                |
// |           |   | EvLoad         |
// |           -----                |
//  --------------------------------

但是我如何将参数传输到状态,例如文件名? 如果我将文件名存储在 EvLoad 中,我可以轻松访问它以进行状态 react

struct Loaded : sc::simple_state< Loaded, Project>
{
    typedef sc::custom_reaction< EvLoad > reactions;
    sc::result react( const EvLoad & e )
    {
        //load file e.path()
        ...
        return discard_event();
    }
}

但是当我处于 Unloaded 状态时,我正在调用 Loaded 的构造函数,但我无法将参数传递给它。我想出的唯一解决方法是在进行转换之前重新发布事件,但这对我来说看起来有点脏。

struct Unloaded : sc::simple_state< Unloaded, Project >
{
    typedef sc::custom_reaction< EvLoad > reactions;
     sc::result react( const EvLoad & e )
     {
         post_event( e ); //workaround to pass the event to the loaded state
         return transit<Loaded>();
     }
};

有更好的选择吗?

最佳答案

我们使用triggering_event方法拉取触发事件,然后将数据作为成员变量附加到触发事件上即可。它节省了大量编码工作,使我们不必生成自定义 react 或将转换变量附加到状态图(我见过的两种常见方法)。

关于c++ - 通过转换 boost 状态图传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968841/

相关文章:

c++ - 构造函数调用问题

c++ - 如何使用 Date 数据类型编写 mongocxx (v3) 查询?

c++ - 游戏设计与程序语言和 OOP 语言的差异

c++ - Boost 的 "cstdint"用法

c++ - 如何为 boost::tokenizer 实现 tokenizer.rbegin() 和 rend()?

c++ - boost "no such file or directory"

c++ - 如何知道异步状态机何时终止。 ( boost::状态图)

c++ - Boost.Python 是否需要其他 boost 库的绑定(bind)代码?

c++ - 用 g++ 编译的奇怪代码