从同一类的两个不同模板副本继承时重载

问题描述:

我正在为可以扩展为任意事件类型的游戏编写输入处理系统。我想设计一个类似界面的规范,允许我强制执行某些对象需要处理某些事件;例如通过诸如class Player : public EventHandler<KeyboardEvent>之类的东西。我提议的这样的设计如下。从同一类的两个不同模板副本继承时重载

template <class T> 
class EventHandler { 
public: 
    void handleEvent(T event) { doHandleEvent(event); }; 
private: 
    virtual void doHandleEvent(T event) {}; 
}; 

class InputHandler : public EventHandler<Action>, public EventHandler<CursorEvent> {}; 

但是,在我呼叫InputHandler::handle()的地方,上述情况会产生以下错误。对于EventHandler的两个模板版本,看起来handleEvent()都被视为相同的功能。我的印象是,由于handleEvent这两个版本具有不同的参数类型,所以结果应该如同InputHandler有两个可能的参数类型的重载函数。

为什么C++不允许这样做,以及我正在尝试做什么更好的替代方法?我怀疑上述可能不是很好的做法。

/Users/smichaels/Projects/danmaku/src/SDL/Input.cpp:35:34: error: member 'handleEvent' found in multiple base classes 
     of different types 
       if (act) handler.handleEvent(act.get()); 
           ^
/Users/smichaels/Projects/danmaku/src/SDL/../Input/InputHandler.hpp:15:14: note: member found by ambiguous name lookup 
     void handleEvent(T event) { doHandleEvent(event); }; 
      ^
/Users/smichaels/Projects/danmaku/src/SDL/../Input/InputHandler.hpp:15:14: note: member found by ambiguous name lookup 

class InputHandler : 
    public EventHandler<Action>, 
    public EventHandler<CursorEvent> 
{ 
public: 
    using EventHandler<Action>::handleEvent; 
    using EventHandler<CursorEvent>::handleEvent; 
}; 

你可以代替写:

template<class...Bases> 
struct ManyHandler:Bases...{ 
    using Bases::handleEvent...; 
}; 
template<class...Events> 
using EventsHandler=ManyHandler< EvendHandler<Events>...>; 

然后

class InputHandler : public EventsHandler<Actions, CursorEvent >{}; 

,如果你也有

class OutputHandler : public EventsHandler< Messages, Sounds >{}; 

我们可以写

class IoHandler : public ManyHandler< InputHandler, OutputHandler > {}; 
+0

非常感谢您,这正是我一直在寻找的! –