#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <functional>
using std::string;
using std::cout;
using std::cin;
using std::vector;
using std::endl;
using std::map;
class Object {
public:
virtual string ToString() const = 0;
virtual ~Object() = default;
};
map <string, std::function<Object*()>> info;
vector <string> keys;
class Apple : public Object {
public:
string ToString() const override {
return "apple!";
}
};
class List : public Object {
public:
string ToString() const override {
return "list";
}
};
class YetAnotherId : public Object {
public:
string ToString() const override {
return "yet another identifier";
}
};
class Smth : public Object {
public:
explicit Smth(const string &class_id) {
class_id_ = class_id;
}
string ToString() const override {
return class_id_;
}
private:
string class_id_;
};
Object *anyCreator_() {
return new Smth(keys[keys.size() - 1]);
}
class Factory {
public:
Object *Create(const string &class_id) {
if (class_id == "apple!") {
return new Apple;
} else if (class_id == "list") {
return new List;
} else if (class_id == "yet another identifier") {
return new YetAnotherId;
} else {
for (auto const& element : info)
keys.push_back(element.first);
return info[class_id]();
}
}
void Register(const string &class_id, Object *(*creator)()) {
info[class_id] = creator;
}
};