代码之家  ›  专栏  ›  技术社区  ›  Mawg says reinstate Monica

需要用C++模板帮助

  •  2
  • Mawg says reinstate Monica  · 技术社区  · 15 年前

    我相当肯定这是一个模板问题,因为我似乎无法以任何其他方式解决它——但非模板解决方案也受欢迎。

    有限状态机有许多程序状态,每个状态都可以对许多事件作出反应。

    所以,我想为事件、状态和FSM定义类。fsm有一个状态集合(可能是向量,如果stl在嵌入式系统中给出问题,则可能是链表),而state有一个事件集合。

    每个状态和事件都有一个唯一的ID和一个用于调试海豚的名称字符串。

    更尴尬的是,我不希望ID是整数,而是枚举的元素。每个FSM的状态和事件都有不同的枚举。

    如何最好地编码?你能举一个例子,两个简单的fsm,或者一个具有两个状态的fsm,每个状态都有两个事件吗?

    例如,如果我有

    enum myEvents {a, b, c};
    enum hisEvents {d, e, f, g};
    

    我希望能够声明一个事件类,其中accpts构造函数参数

    (myEvents a,char *"event_a")
    (hisEvents g,char* "event_g")
    请注意,我不想只重载构造函数,因为这是有限制的——如果添加了新的事件枚举会怎么样?

    与状态类似,然后让我的FSM每个都有一个状态列表。

    或者我只是一个anel,坚持eventid的枚举,什么时候 许多的 传递int更简单?

    谢谢。


    顺便说一句,我宁愿避免增强,因为它本身还不确定它在嵌入式系统中的工作情况。为了完全控制,我更喜欢内部开发。

    2 回复  |  直到 15 年前
        1
  •  2
  •   BCS    15 年前

    如果我能正确理解事情,我就不是舒尔,但我会尝试一下:

    我假设您希望通过定义转换来定义状态机;例如,“当状态为‘MyEvents’时,您会看到‘Do’事件A’”

    class State {};
    template<T> RealState : State
    {
        static void Add(T event, char*) { /* save stuff */ }
    };
    
    class Event {};
    template<T> RealEvent : Event    {
        RealEvent(T event, char* name) {RealState<T>(event, name); }
    };
    

    一些你需要采取行动的方法,以及其他什么,你会想把它弄脏一点,以得到一个以上的状态机,但我希望这能让你开始。

        2
  •  1
  •   Georg Fritzsche    15 年前

    虽然我理解为什么要通过一般地实现状态机基础知识来避免代码冗余,但我不理解为什么要自己实现这一点。

    看看现有的实现,比如 Boost.Statechart 或者任何最适合您使用场景的东西。