gpt4 book ai didi

c++ - 从同一类的两个不同模板拷贝继承时重载

转载 作者:行者123 更新时间:2023-11-28 04:58:17 25 4
gpt4 key购买 nike

我正在为一款游戏编写一个输入处理系统,我想将该系统扩展到任意事件类型。我想设计一个类似接口(interface)的规范,允许我强制要求某些对象处理某些事件;例如通过类似 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() 的地方,上面会产生以下错误。看来 handleEvent()对于 EventHandler 的两个模板版本被视为相同的功能。我的印象是,自从 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 > {};

关于c++ - 从同一类的两个不同模板拷贝继承时重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46699332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com