【问题标题】:Need help with C++ templates需要 C++ 模板方面的帮助
【发布时间】:2011-01-02 18:30:15
【问题描述】:

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

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

所以,我想为 Event、State 和 FSM 定义类。 FSM 有一个 State 集合(可能是向量,如果 STL 在嵌入式系统中出现问题,可能是链表),State 有一个 Events 集合。

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

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

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

例如,如果我有

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

我希望能够声明一个接受构造函数参数的事件类

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

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

或者我只是一个人,坚持为 eventId 枚举,什么时候传递一个 int 会简单得多

谢谢。


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

【问题讨论】:

  • 你有固定数量的id?
  • 仅供参考,Qt 有一个状态机框架,它适用于嵌入式平台。即使你不想使用 Qt,他们的 API 也可能会提供灵感/想法:doc.trolltech.com/solutions/4/qtstatemachine/…
  • 我认为模板在这里对您没有多大帮助。我会为事件和状态使用抽象基类。 FSM 需要记住它的当前状态并接受导致转换到其他状态的事件。每个状态只是事件到状态 ID 的映射。使用枚举很好,但可维护性较差。你不能在不修改枚举的情况下添加新状态,尽管它确实让你保持 id 相同的值以帮助序列化到磁盘。

标签: c++ templates fsm


【解决方案1】:

如果我理解正确,我不确定,但我会尝试一下:

我假设您想通过定义转换来定义状态机;例如"当处于 'myEvents' 状态时,你会看到 'a' do 'event_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】:

虽然我理解您为什么要通过通用实现状态机基础来避免代码冗余,但我不明白您为什么要自己实现。

查看现有的实现,例如 Boost.Statechart 或任何最适合您的使用场景的实现。

【讨论】:

  • 因为,如上所述,boost 本身在涉及嵌入式系统时会模棱两可
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多