#ifndef ENGINE_GAME_FACTORY_H #define ENGINE_GAME_FACTORY_H #include #include #include #define DECLARE_GAME_BEGIN \ std::vector> \ eng::GameFactoryBase::game_classes = { #define DECLARE_GAME(CLASS) {#CLASS, new eng::GameFactory()}, #define DECLARE_GAME_END }; namespace eng { class Game; class GameFactoryBase { public: virtual ~GameFactoryBase() = default; static std::unique_ptr CreateGame(const std::string& name) { if (name.empty()) return game_classes.size() > 0 ? game_classes.begin()->second->CreateGame() : nullptr; for (auto& element : game_classes) { if (element.first == name) return element.second->CreateGame(); } return nullptr; } private: virtual std::unique_ptr CreateGame() { return nullptr; } static std::vector> game_classes; }; template class GameFactory final : public GameFactoryBase { public: ~GameFactory() final = default; private: using GameType = Type; std::unique_ptr CreateGame() final { return std::make_unique(); } }; } // namespace eng #endif // ENGINE_GAME_FACTORY_H