#include <string>
#include <vector>
#include <random>
#include <memory>

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

    virtual ~Object() {}
};

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

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

 private:
    std::string class_id_;
};

Object *NewSomeObject(const std::string &class_id) {
    return new Smth1(class_id);
}

class Factory {
 public:
    void Register(const std::string &class_id, Object *(*instance_creator)()) {
        this->id.push_back(class_id);
        this->funcs.push_back(instance_creator);
    }

    Object *Create(const std::string &basicString) {
        for (const auto &i : this->std_id) {
            if (i == basicString) {
                return NewSomeObject(basicString);
            }
        }
        for (unsigned int i = 0; i < this->id.size(); i++) {
            if (this->id[i] == basicString) {
                return this->funcs[i]();
            }
        }
        return {};
    }

 private:
    std::vector<std::string> std_id{"list", "apple!", "yet another identifier"};
    std::vector<std::string> id;
    std::vector<Object *(*)()> funcs;
};