背景:我正在尝试在C ++ 14中实现一个状态机,以便熟悉现代C ++。为此,我正在实现一个事件处理机制,以便State
个对象可以在内部处理事件或者通过转换到另一个状态来处理事件。
目标:State
定义virtual void handleEvent(const Event& e)
方法,State
子类应该能够定义一系列Event
子类的方法选择。
当前解决方案:使用std::unordered_map<std::type_index, std::function<void(const Event&)>>
和方法template<class EventT> addHandler(std::function<void(const EventT&)>)
目前似乎是最佳选择,但由于必须添加每个实际的处理程序方法,因此会有很多重复到State
子类的构造函数中的映射。这个添加非常冗长,因为实际的处理程序需要绑定this
,以便它可以传递给基类addHandler
方法。
问题:是否有更好的解决方案,重复次数减少,添加事件处理程序的自动化程度更高?
答案 0 :(得分:0)
我找到了一种至少更清洁的解决方案。除了主State
类之外,我使用函数IEventHandler<EventT>
定义了模板类virtual void handleEvent(const EventT&)
。
State
子类也继承自例如IEventHandler<ConcreteEvent>
中的handleEvent
和State
中的通用dynamic_cast
函数使用this
来查看this
是否为当前事件类型实现了事件处理程序。然后可以使用<span data-ng-repeat="user in Users">{{user.Username}}<font ng-show="!$last">,</font></span>
的强制转换版本来处理事件。
这里仍有一些重复,但至少我不必像在我以前的解决方案中那样在构造函数中单独注册处理程序。