#pragma once #include namespace sp { template class ConcreteMessage : public MessageBase { public: using DataType = TData; template ConcreteMessage(const T&... args) : m_Data{args...} {} virtual ~ConcreteMessage() {} virtual TMessageID GetId() const override { return ID; } virtual void Dispatch(THandler& handler) const override { handler.Handle(static_cast&>(*this)); } private: DataType m_Data; }; } // namespace sp