#pragma once #include #include namespace sp { template class ConcreteMessage : public MessageBase { public: using DataType = TData; using MessageIdType = typename MessageBase::MessageIdType; using HandlerType = typename MessageBase::HandlerType; template ConcreteMessage(const T&... args) : m_Data{args...} {} virtual ~ConcreteMessage() {} virtual MessageIdType GetId() const override { return ID; } virtual void Dispatch(HandlerType& handler) const override { handler.Handle(static_cast(m_Data)); } virtual void Read(DataBuffer& a_Buffer) override { details::ReadMessage(a_Buffer, m_Data); } virtual DataBuffer Write() const override { return details::WriteMessage(m_Data); } private: DataType m_Data; }; } // namespace sp