#pragma once #include #include #include #include namespace sp { namespace details { template using ArrayType = std::vector(void)>>; template struct ArrayFiller {}; template struct ArrayFiller> { static void ArrayAppend(details::ArrayType& array) { ArrayFiller::ArrayAppend(array); } }; template struct ArrayFiller { static void ArrayAppend(details::ArrayType& array) { ArrayFiller::ArrayAppend(array); ArrayFiller::ArrayAppend(array); } }; template struct ArrayFiller { static void ArrayAppend(details::ArrayType& array) { array.push_back([]() -> std::unique_ptr { return std::make_unique(); }); } }; } // namespace details template class MessageFactory { public: using IdType = typename TBase::MsgIdType; MessageFactory() { details::ArrayFiller::ArrayAppend(m_Factory); } std::unique_ptr CreateMessage(IdType id) { if (id >= m_Factory.size()) return nullptr; return m_Factory.at(id)(); } private: details::ArrayType m_Factory; }; } // namespace sp