半自动添加事件处理程序方法 背景:我试图在C++ 14中实现一个状态机,作为一个练习来熟悉现代C++。为此,我正在实现一种事件处理机制,以便State对象可以在内部处理事件,也可以通过引起到另一个状态的转换来处理事件
目标:半自动添加事件处理程序方法 背景:我试图在C++ 14中实现一个状态机,作为一个练习来熟悉现代C++。为此,我正在实现一种事件处理机制,以便State对象可以在内部处理事件,也可以通过引起到另一个状态的转换来处理事件,c++,c++14,overloading,C++,C++14,Overloading,目标:状态定义一个虚拟无效句柄事件(const-Event&e)方法,状态子类应该能够为其选择的一系列事件子类定义方法 当前解决方案:使用std::unordered_映射和方法template addHandler(std::function)目前似乎是最好的选择,但是有很多重复,因为每个实际的处理方法都必须添加到状态子类的构造函数中的映射中。这个添加非常冗长,因为实际的处理程序需要绑定This,以便将其传递给基类addHandler方法 问题:是否有一个更好的解决方案,可以减少重复,增加事件
状态
定义一个虚拟无效句柄事件(const-Event&e)
方法,状态
子类应该能够为其选择的一系列事件
子类定义方法
当前解决方案:使用std::unordered_映射
和方法template addHandler(std::function)
目前似乎是最好的选择,但是有很多重复,因为每个实际的处理方法都必须添加到状态
子类的构造函数中的映射中。这个添加非常冗长,因为实际的处理程序需要绑定This
,以便将其传递给基类addHandler
方法
问题:是否有一个更好的解决方案,可以减少重复,增加事件处理程序的自动化程度?我找到了一个至少更干净的解决方案。除了主
State
类之外,我还使用函数virtualvoidhandleevent(const-event&)
定义了一个模板类IEventHandler
State
子类也继承自例如IEventHandler
,而State
中的泛型handleEvent
函数使用dynamic\u cast
来查看此
是否为当前事件类型实现了事件处理程序。然后可以使用此的强制转换版本来处理事件
这里仍然有一些重复,但至少我不必像以前的解决方案那样在构造函数中单独注册处理程序。我找到了一个至少更干净的解决方案。除了主
State
类之外,我还使用函数virtualvoidhandleevent(const-event&)
定义了一个模板类IEventHandler
State
子类也继承自例如IEventHandler
,而State
中的泛型handleEvent
函数使用dynamic\u cast
来查看此
是否为当前事件类型实现了事件处理程序。然后可以使用此的强制转换版本来处理事件
这里仍然有一些重复,但至少我不必像以前的解决方案那样在构造函数中单独注册处理程序。我不太理解您的“每个实际的处理程序方法都有很多重复…”-您能在设置这些处理程序的地方添加代码吗(因此,我们可以看到您试图消除的重复部分).State子类都为事件子类定义了一个函数
handleEvent
,这些函数必须添加到构造函数中的std::unordered_map
。这些添加包括一个lambda,每个lambda都将函数绑定到this
。我现在没有这方面的确切代码,但如果您希望,我可以在以后添加它它大致如下:_handlers[std::type_index(typeid(ConcreteEvent))]=[this](const Event&e){ConcreteState::handleConcreteEvent(this,static_cast(e));};
对于构造函数中的每个处理程序。这里是我原始代码的简化版本:我不太理解您的“每个实际处理程序方法都有很多重复…”-您能在设置这些处理程序的地方添加代码吗(这样我们就可以看到您试图消除的重复部分).State子类都为事件子类定义了一个函数handleEvent
,这些函数必须添加到构造函数中的std::unordered_map
。这些添加包括一个lambda,每个lambda都将函数绑定到this
。我现在没有这方面的确切代码,但如果您希望,我可以在以后添加它呃,大致如下:\u handlers[std::type_index(typeid(ConcreteEvent))]=[this](const Event&e){ConcreteState::handleConcreteEvent(this,static_cast(e));};
对于构造函数中的每个处理程序。以下是我原始代码的简化版本: