首页 > 解决方案 > 函数的模板推导如何在 C++ 中工作?

问题描述

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

标签: c++c++17

解决方案


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

一般来说,这段代码对我来说看起来不太好。这里需要这样的演员阵容这一事实令人担忧。很有可能这整个装置实际上是在调用未定义的行为,但很难说不知道是什么,例如,整体GetEventType()GetStaticType()业务是关于什么的,这里涉及的所有类型实际上是什么......

PS:参数func可能最好在这里通过引用传递。


推荐阅读