#pragma once #include #include #include #include namespace sp { namespace details { template using ArrayType = std::vector(void)>>; template struct ArrayFiller {}; template struct ArrayFiller> { static ArrayType ArrayCreate() { ArrayType array; array.reserve(sizeof...(TMessages)); ArrayFiller::ArrayAppend(array); return 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() : m_Factory(details::ArrayFiller::ArrayCreate()) {} 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