半自动添加事件处理程序方法
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
的转换版本来处理事件。
这里还有一些重复,但至少我不必像我以前的解决方案那样在构造函数中单独注册处理程序。
背景:我正在尝试在 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
的转换版本来处理事件。
这里还有一些重复,但至少我不必像我以前的解决方案那样在构造函数中单独注册处理程序。