半自动添加事件处理程序方法

时间:2016-01-31 10:04:48

标签: c++ c++14 overloading

背景:我正在尝试在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方法。

问题:是否有更好的解决方案,重复次数减少,添加事件处理程序的自动化程度更高?

1 个答案:

答案 0 :(得分:0)

我找到了一种至少更清洁的解决方案。除了主State类之外,我使用函数IEventHandler<EventT>定义了模板类virtual void handleEvent(const EventT&)

State子类也继承自例如IEventHandler<ConcreteEvent>中的handleEventState中的通用dynamic_cast函数使用this来查看this是否为当前事件类型实现了事件处理程序。然后可以使用<span data-ng-repeat="user in Users">{{user.Username}}<font ng-show="!$last">,</font></span> 的强制转换版本来处理事件。

这里仍有一些重复,但至少我不必像在我以前的解决方案中那样在构造函数中单独注册处理程序。