#include class Object { public: virtual std::string ToString() const = 0; virtual ~Object() {} }; class Factory : public Object { public: Factory() {} explicit Factory(const std::string& class_id) : class_id_(class_id) {} std::string ToString() const override { return class_id_; } Object* Create(const std::string& class_id) { return new Factory(class_id); } void Register(const std::string& class_id, Object*(*instance_creator)()) { instance_creator(); } private: std::string class_id_; };