#pragma once #include #include #include template class ConcreteMessage { public: using DataType = TData; template ConcreteMessage(const T&... args) : m_Data {args ...}; private: DataType m_Data; virtual sp::PacketID GetId() const { return ID; } }; struct KeepAlivePacket { std::uint64_t m_AliveId; }; class KeepAliveMessage : public sp::MessageBase> { private: KeepAlivePacket m_Data; public: template KeepAliveMessage(T... args) : m_Data{args...} {} virtual sp::PacketID GetId() const { return KeepAlive; } };