本机C++11事件-没有任何绑定的事件引发错误
Native C++11 Event - Event with nothing bound throws error
我有一个这样的事件处理程序,
__event void MouseMoved(int MousePosX, int MousePosY);
并通过提升
__raise MouseMoved(MousePosX, MousePosY);
在使用__hook向事件添加函数后,这一操作非常好;然而,如果我引发,即使任何绑定到事件的函数都会出现运行时错误。在引发事件之前,是否有方法检查事件是否为空?
C++’11没有本机事件。C++’14也是如此。
在我看来,这是Microsoft Visual C++特有的功能——也许是Microsoft的统一事件模型?如果是这样的话,根据他们的文档,引发一个没有订阅者的事件不应该导致错误:
要激发事件,只需调用在事件源类中声明为事件的方法。如果处理程序已挂接到事件,则将调用处理程序。
另一方面,.NET要求您在引发事件之前检查事件是否为null,并且您正在使用的关键字也可以在托管C++项目中使用,因此如果您创建了一个托管应用程序,则很可能需要执行类似的操作
if(MouseMoved != nullptr) {
__raise MouseMoved(MousePosX, MousePosY);
}
如果你想编写在其他编译器和/或平台上运行的可移植C++,我可以推荐libsigc++或JL Signal。
我选择只定义自己的事件对象,该对象包含可以按顺序调用的函数指针列表。If函数与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;
}
}
}
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- 如何从Qt绑定到在Windows 7 / 8 / 10中连接/断开USB设备事件
- 解除 lambda 事件处理程序的绑定
- 本机C++11事件-没有任何绑定的事件引发错误
- 用API模拟“std::shared_ptr”的智能指针,将回调绑定到refcount-modifying事件,例如re