我遇到了为事件调度程序编写的这段代码。它将首先检查事件的类型是否是它想要的类型,然后它将运行一个以事件为参数的模板化函数,我对该函数的参数语法有疑问((*( T *)&m_Event)的意思是,为什么在T之前有一个星号?为什么在T之后有一个星号?)
class EventDispatcher
{
template<typename T>
using EventFn = std::function<bool(T&)>;
public:
EventDispatcher(Event& event)
: m_Event(event)
{
}
template<typename T>
bool Dispatch(EventFn<T> func)
{
if (m_Event.GetEventType() == T::GetStaticType())
{
m_Event.m_Handled = func(*(T*)&m_Event);
return true;
}
return false;
}
private:
Event& m_Event;
};
答案 0 :(得分:1)
(T*)
是一种C样式的强制转换,在这里用于将&m_Event
强制转换为指向T
的指针。然后将所有这些结果取消引用(最左侧的*
)。最后,这只是将对对象m_Event
的引用传递给对func
的调用的一种可疑的复杂方式(除非有一些操作符重载,我们应该意识到)。>
通常,这段代码对我来说不太好。令人担忧的是,这里需要这样的演员。很有可能这整个装置实际上是在调用未定义的行为,但是很难说,例如整个GetEventType()
和GetStaticType()
的业务是什么,以及这里涉及的所有类型实际上是什么……>
PS:这里最好通过引用传递参数func
。