所以我在做这个事件管理类。我存储指针到签名void (Event*)的成员函数的一个列表,其中事件是只是此刻存储一些随机数据的结构。

typedef boost::function<void(Event*)> Callback;
typedef vector<Callback> CallbackList;

class EventManager
{
public:
   template<typename T>
   void RegisterEventHandler(const std::string& type, void (T::*handler)(Event*), T* obj)
   {
      mCallbackList[type].push_back(boost::bind(handler, obj, _1));
   }

   void DispatchEvent(const std::string& type, Event* evt)
   {
      for(CallbackList::iterator it = mCallbackList[type].begin(); it != mCallbackList[type].end(); ++it)
      {
         Callback callback = (*it);
         callback(evt);
      }   
   }
private:
   hash_map<std::string, CallbackList> mCallbackList;
};

我想知道,如果有可能,我推导出不同版本的事件,并通过指针的成员函数到这个班?目前,我想要这个。

class MouseEvent : public Event
{
public:
   int testMouseData1;
   int testMouseData2;
   int testMouseData3;
};

class HelloWorld 
{
public:
   void Display(MouseEvent* evt)
   {
      cout << "Hello, world!" << endl;
   }
};


int main(void)
{
   MouseEvent* evt = new MouseEvent();

   HelloWorld* world = new HelloWorld();
   eventManager->RegisterEventHandler("testType", &HelloWorld::Display, world);

   return 0;
}

这使我有以下错误XCode中。

  

错误:用于调用 'EventManager::RegisterEventHandler(const char [9], void (HelloWorld::*)(MouseEvent*), HelloWorld*&)'

没有匹配的功能

你知道我怎么能放心地通过该公司预计,派生类中的函数签名的指针?感谢。

有帮助吗?

解决方案

所以我发现,似乎是为我工作的一个解决方案,但我不知道这是否是完全安全的做法。我改变了RegisterEventHandler方法铸造的所有函数指针,我发送到相同类型的...

 template<typename T1, typename T2>
   void RegisterEventHandler(const String& type, T1 handler, T2* obj)
   {
      void (T2::*evtHandler)(Event*) = (void (T2::*)(Event*)) (handler);
      mCallbackList[type].push_back(boost::bind(evtHandler, obj, _1));
   }

现在这一切似乎我原本打算只是工作。但我很新的这一切,所以我不能完全肯定,如果这是做一个安全的事情。有什么想法吗?感谢

其他提示

如果您的原型预计“事件”型,那么你需要确保void Display(MouseEvent* evt)功能接受“Event”型。因此,将其更改为void Display(Event *evt)接着,电话里,你可以强制转换回一个MouseEvent,假设调用者传递的实际MouseEvent,作为“Event”。

引用

其次,我相信你可以有你调用RegisterEventHandler方式其他一些问题,因为它是一个模板,但你没有指定模板类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top