我正在为游戏实现一个事件系统.它使用事件队列和数据结构来保存给定事件类型的所有已注册事件处理程序.它到目前为止注册处理程序工作得很好,但是当取消注册它们时(例如,当游戏对象被销毁时会发生这种情况)我在模板和转换方面遇到了一些麻烦.
我已经将EventHandler定义为某种函子,部分基于Szymon Gatner在http://www.gamedev.net/reference/programming/features/effeventcpp/上的文章.确切地说,我使用了HandlerFunctionBase和MemberFunctionHandler类定义并提出了:
class BaseEventHandler
{
public:
virtual ~BaseEventHandler(){}
void handleEvent(const EventPtr evt)
{
invoke(evt);
}
private:
virtual void invoke(const EventPtr evt)=0;
};
template <class T, class TEvent>
class EventHandler: public BaseEventHandler
{
public:
typedef void (T::*TMemberFunction)(boost::shared_ptr<TEvent>);
typedef boost::shared_ptr<T> TPtr;
typedef boost::shared_ptr<TEvent> TEventPtr;
EventHandler(TPtr instance, TMemberFunction memFn) : mInstance(instance), mCallback(memFn) {}
void invoke(const EventPtr evt)
{
(mInstance.get()->*mCallback)(boost::dynamic_pointer_cast<TEvent>(evt));
}
TPtr getInstance() const{return mInstance;}
TMemberFunction getCallback() const{return mCallback;}
private:
TPtr mInstance;
TMemberFunction mCallback;
};
Run Code Online (Sandbox Code Playgroud)
然后我想到的EventManager类上的unregisterHandler()方法的初始实现将如下所示:
// EventHandlerPtr is a boost::shared_ptr<BaseEventHandler>. …Run Code Online (Sandbox Code Playgroud)