#pragma once #include #include #include #include namespace sp { template class MessageFactory { public: using IdType = typename TBase::MessageIdType; using MessageBaseType = TBase; MessageFactory() { constexpr std::size_t messageCount = std::tuple_size_v; m_Factory.resize(messageCount); TupleForEach([this](const auto& message){ std::size_t messageID = static_cast(message.GetId()); using MessageType = std::remove_const_t>; m_Factory.emplace(m_Factory.begin() + messageID, []() -> std::unique_ptr { return std::make_unique(); }); }, TTMessages{}); } std::unique_ptr CreateMessage(IdType id) const { std::size_t idSize = static_cast(id); if (idSize >= m_Factory.size()) return nullptr; return m_Factory.at(idSize)(); } private: std::vector(void)>> m_Factory; }; } // namespace sp