#include <map>

class Object {
public:
    virtual std::string ToString() const = 0;
    virtual ~Object() {}
};

class Smth1 : public Object {
public:
    Smth1(const std::string& class_id) {
        class_id_ = class_id;
    }

    std::string ToString() const override {
        return class_id_;
    }
private:
    std::string class_id_;
};

Object* my_new_smth_1(std::string class_id) {
    return new Smth1(class_id);
}


std::map<std::string, Object*(*)()> registered;

class Factory {
public:
    void Register(const std::string& class_id, Object*(*instance_creator)()){
        registered[class_id] = instance_creator;
    }
    Object* Create(const std::string& class_id){
        if (class_id != "apple!" && class_id != "list" && class_id != "yet another identifier") {
            return registered[class_id]();
        }
        else {
            return my_new_smth_1(class_id);
        }
    }
};