函数的模板推导如何在C ++中工作?

时间:2019-04-01 23:00:26

标签: c++ c++17

我遇到了为事件调度程序编写的这段代码。它将首先检查事件的类型是否是它想要的类型,然后它将运行一个以事件为参数的模板化函数,我对该函数的参数语法有疑问((*( 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;
    };

1 个答案:

答案 0 :(得分:1)

(T*)是一种C样式的强制转换,在这里用于将&m_Event强制转换为指向T的指针。然后将所有这些结果取消引用(最左侧的*)。最后,这只是将对对象m_Event的引用传递给对func的调用的一种可疑的复杂方式(除非有一些操作符重载,我们应该意识到)。

通常,这段代码对我来说不太好。令人担忧的是,这里需要这样的演员。很有可能这整个装置实际上是在调用未定义的行为,但是很难说,例如整个GetEventType()GetStaticType()的业务是什么,以及这里涉及的所有类型实际上是什么……

PS:这里最好通过引用传递参数func