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

Semi-automatically adding event handler methods

背景:我正在尝试在 C++14 中实现一个状态机,作为熟悉现代 C++ 的练习。为此,我正在实施一个事件处理机制,以便 State 对象可以在内部或通过转换到另一个状态来处理事件。

目标: State 定义了一个 virtual void handleEvent(const Event& e) 方法并且 State subclasses 应该能够为他们选择的一系列 Event 个子 class。

当前解决方案:使用std::unordered_map<std::type_index, std::function<void(const Event&)>>和方法template<class EventT> addHandler(std::function<void(const EventT&)>)目前似乎是最好的选择,但每个实际处理程序都有很多重复方法必须添加到 State subclass 的构造函数中的映射。这个添加非常冗长,因为实际的处理程序需要绑定 this 以便它可以传递给基本 class addHandler 方法。

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

我找到了一个至少更简洁的解决方案。除了主 State class,我还定义了一个模板 class IEventHandler<EventT> 和函数 virtual void handleEvent(const EventT&).

State subclasses 也继承自例如IEventHandler<ConcreteEvent>State 中的通用 handleEvent 函数使用 dynamic_cast 来查看 this 是否为当前事件类型实现了事件处理程序。然后可以使用 this 的转换版本来处理事件。

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