#pragma once #include #include namespace sp { template class ConcreteMessage : public MessageBase { public: using DataType = TData; using ThisType = ConcreteMessage; 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)); } virtual void Read(std::istream& a_Is) override { details::ReadMessage(a_Is, m_Data); } virtual void Write(std::ostream& a_Os) const override { details::WriteMessage(a_Os, m_Data); } private: DataType m_Data; }; } // namespace sp