#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;
};