我有一個事件處理程序,例如,原生C++ 11事件 - 事件沒事勢必會引發錯誤
__event void MouseMoved(int MousePosX, int MousePosY);
,並通過
__raise MouseMoved(MousePosX, MousePosY);
這個工程使用__hook後完全沒有上調給事件添加一個函數;然而,如果我提出即使綁定到事件的任何函數,我也會遇到運行時錯誤。在提升之前是否有辦法檢查事件是否爲空?
我有一個事件處理程序,例如,原生C++ 11事件 - 事件沒事勢必會引發錯誤
__event void MouseMoved(int MousePosX, int MousePosY);
,並通過
__raise MouseMoved(MousePosX, MousePosY);
這個工程使用__hook後完全沒有上調給事件添加一個函數;然而,如果我提出即使綁定到事件的任何函數,我也會遇到運行時錯誤。在提升之前是否有辦法檢查事件是否爲空?
我選擇只是定義我自己的事件對象,它包含可以按順序調用的函數指針列表。如果函數與C#中的事件和事件處理程序非常相似。
struct EventArg
{
public:
EventArg(){}
~EventArg(){}
static EventArg Empty()
{
EventArg empty;
return empty;
}
};
template <typename T>
class EventHandler
{
public:
EventHandler(void(T::*functionHandle)(void*, EventArg), T* receiver)
{
this->functionHandle = functionHandle;
this->receiver = receiver;
}
virtual void Call(void* sender, EventArg e)
{
(receiver->*functionHandle)(sender, e);
}
private:
void (T::*functionHandle)(void*, EventArg);
T* receiver;
};
class Event
{
private:
std::vector<EventHandlerBase*> EventHandlers;
public:
void Raise(void* sender, EventArgT e)
{
for (auto item = EventHandlers.begin(); item != EventHandlers.end(); item++)
(*item)->Call(sender, e);
}
void Add(EventHandler* functionHandle)
{
EventHandlers.push_back(functionHandle);
}
void Remove(EventHandler* functionHandle)
{
for (auto item = EventHandlers.begin(); item != EventHandlers.end(); item++)
{
if ((*item) == functionHandle)
{
EventHandlers.erase(item);
return;
}
}
}
}
C++ '11沒有本地事件。 C++ '14也沒有。
這對我來說是什麼樣的功能是特定於Microsoft Visual C++ - 也許Microsoft's Unified Event Model?如果是這樣的話,舉一個沒有訂閱者的事件不應該導致錯誤根據他們的文檔:
要觸發一個事件,只需調用聲明爲事件源類中的事件的方法。如果處理程序被掛鉤,處理程序將被調用。
在另一方面,.NET需要您檢查事件撫養他們和你使用同樣在託管C++項目工作的這些關鍵字之前是空的,所以如果你創建了一個託管應用程序,它可以很好是你需要的,如果你想寫可以移植的C++,關於其他的編譯器和/或平臺的工作做類似的東西
if(MouseMoved != nullptr) {
__raise MouseMoved(MousePosX, MousePosY);
}
選中此:http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx – 2014-10-19 22:05:48
這是我鏈接到Microsoft Visual C++特定編譯器擴展的非常文章。關於空檢查,它編譯並在Visual C++ 2013 Express上運行:http://pastebin.com/KxStV0yy – Cygon 2014-10-19 22:09:02
本地C++ 11沒有__event。所以請標記並正確命名您的問題! – Klaus 2014-10-22 07:18:23