Как работает вывод шаблона для функций в C ?

#c #c 17

#c #c 17

Вопрос:

Я наткнулся на этот фрагмент кода, созданный для диспетчера событий. сначала он проверит, соответствует ли тип события тому, который он хочет, затем он запустит шаблонную функцию с событием в качестве аргумента, у меня проблема с синтаксисом аргумента для этой функции (что означает (* (T *) amp; m_Event), почему звездочка перед T? почему один после T?)

 class EventDispatcher
    {
        template<typename T>
        using EventFn = std::function<bool(Tamp;)>;
    public:
        EventDispatcher(Eventamp; event)
            : m_Event(event)
        {
        }

        template<typename T>
        bool Dispatch(EventFn<T> func)
        {
            if (m_Event.GetEventType() == T::GetStaticType())
            {
                m_Event.m_Handled = func(*(T*)amp;m_Event);
                return true;
            }
            return false;
        }
    private:
        Eventamp; m_Event;
    };
  

Комментарии:

1. Я не уверен, о каком именно «выводе шаблона» вы спрашиваете. Если вам интересно узнать о выводе аргумента шаблона для вызова, Dispatch<T> тогда вам придется показать нам, как Dispatch вызывается…

Ответ №1:

(T*) приведение в стиле C, которое используется здесь для приведения amp;m_Event к указателю на T . Результат всего этого затем разыменовывается (крайний левый * ). В конце концов, это просто подозрительно сложный способ передачи ссылки на объект m_Event в вызов func (если не происходит какой-либо перегрузки оператора, о которой мы должны знать).

В целом, этот код выглядит не очень хорошо для меня. Тот факт, что здесь потребуется подобное приведение, вызывает беспокойство. Скорее всего, вся эта хитроумная конструкция на самом деле вызывает неопределенное поведение, но трудно сказать, не зная, например, в чем суть всего GetEventType() и GetStaticType() бизнеса и каковы все типы, задействованные здесь на самом деле…

PS: параметр func , вероятно, лучше было бы передать по ссылке здесь.

Комментарии:

1. да, мне это тоже не нравится. но это мне очень помогло, так что большое вам спасибо

2. @WiderGamer Как я уже сказал, скорее всего, это не просто некрасиво, но и на самом деле неверно. Но не могу сказать наверняка, не зная, что T есть и что GetType() делает именно этот материал…

3. Эквивалентное приведение в стиле cpp m_Event.m_Handled = func(static_cast<Tamp;>(m_Event));