#include #include #include #include #include #include class Object { public: virtual std::string ToString() const = 0; virtual ~Object() = default; }; class ObjectImpl : public Object { public: explicit ObjectImpl(const std::string& _id) { id = _id; } std::string ToString() const override { return id; } private: std::string id; }; class Factory { public: Object* Create(const std::string& id) { for (const auto& pair : types) { if (strcmp(id.c_str(), pair.first->c_str()) == 0) { return pair.second(); } } return new ObjectImpl(id); } void Register(const std::string& id, Object* (*instance_creator)()) { types.insert(types.begin(), std::pair>(&id, instance_creator)); } private: std::map> types; };