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