#include <map>
#include <string>
using std::string;
using std::map;
class Object {
public:
virtual string ToString() const = 0;
virtual ~Object() {}
};
class smth : public Object {
public:
explicit smth(string str) {
strr = str;
}
string ToString() const override {
return strr;
}
private:
string strr;
};
Object* new_smth(string id) {
return new smth(id);
}
class Factory {
public:
Factory() {
reg["apple!"] = []() -> Object* {
return new smth("apple!");
};
reg["list"] = []() -> Object* {
return new smth("list");
};
reg["yet another identifier"] = []() -> Object* {
return new smth("yet another identifier");
};
}
~Factory() = default;
Object* Create(const string& class_id) {
return reg[class_id]();
}
void Register(string class_id, Object* (*new_smth)()) {
reg[class_id] = new_smth;
}
private:
map<string, Object* (*)()> reg;
};