#include <utility>
#include <vector>
#include <functional>
#include <cstring>
#include <string>
#include <map>

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<const std::string*,
            std::function<Object* ()>>(&id, instance_creator));
    }
 private:
    std::map<const std::string*,
        std::function<Object* ()>> types;
};