#include <iostream>
struct BaseData {
virtual std::string getValue() = 0;
};
struct ObjectData1: public BaseData {
std::string str;
ObjectData1(std::string iStr):str(iStr){}
std::string getValue() override {
return str;
};
};
struct ObjectData2: public BaseData {
int Int;
ObjectData2(int iInt):Int(iInt){}
std::string getValue() override {
return std::to_string(Int);
};
};
template <typename T>
class Factory {
public:
static T* generate(BaseData *objectData) {
T* Tmp = new T();
Tmp->init(objectData);
return Tmp;
}
};
class Initializer: public Factory<Initializer> {
BaseData *objectData;
public:
void init(BaseData *iObjectData) {
objectData = iObjectData;
std::cout << objectData->getValue() << ": " << typeid(*objectData).name() << "\n";
}
};
int main() {
auto *Data1 = new ObjectData1("String");
auto *Data2 = new ObjectData2(10);
auto *I1 = Factory<Initializer>::generate(Data1);
auto *I2 = Factory<Initializer>::generate(Data2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2VEYXRhIHsKICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFZhbHVlKCkgPSAwOwp9OwoKc3RydWN0IE9iamVjdERhdGExOiBwdWJsaWMgQmFzZURhdGEgewogIHN0ZDo6c3RyaW5nIHN0cjsKICBPYmplY3REYXRhMShzdGQ6OnN0cmluZyBpU3RyKTpzdHIoaVN0cil7fQogIHN0ZDo6c3RyaW5nIGdldFZhbHVlKCkgb3ZlcnJpZGUgewogIAlyZXR1cm4gc3RyOyAKICB9Owp9OwoKc3RydWN0IE9iamVjdERhdGEyOiBwdWJsaWMgQmFzZURhdGEgewogIGludCBJbnQ7CQogIE9iamVjdERhdGEyKGludCBpSW50KTpJbnQoaUludCl7fQogIHN0ZDo6c3RyaW5nIGdldFZhbHVlKCkgb3ZlcnJpZGUgewogIAlyZXR1cm4gc3RkOjp0b19zdHJpbmcoSW50KTsgCiAgfTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBGYWN0b3J5IHsKICBwdWJsaWM6CiAgICBzdGF0aWMgVCogZ2VuZXJhdGUoQmFzZURhdGEgKm9iamVjdERhdGEpIHsKICAgICAgVCogVG1wID0gbmV3IFQoKTsKICAgICAgVG1wLT5pbml0KG9iamVjdERhdGEpOwogICAgICByZXR1cm4gVG1wOwogICAgfQp9OwoKY2xhc3MgSW5pdGlhbGl6ZXI6IHB1YmxpYyBGYWN0b3J5PEluaXRpYWxpemVyPiB7CglCYXNlRGF0YSAqb2JqZWN0RGF0YTsgCiAgcHVibGljOgogICAgdm9pZCBpbml0KEJhc2VEYXRhICppT2JqZWN0RGF0YSkgewogICAgICBvYmplY3REYXRhID0gaU9iamVjdERhdGE7CiAgICAgIHN0ZDo6Y291dCA8PCBvYmplY3REYXRhLT5nZXRWYWx1ZSgpIDw8ICI6ICIgPDwgdHlwZWlkKCpvYmplY3REYXRhKS5uYW1lKCkgPDwgIlxuIjsKICAgIH0KfTsKCmludCBtYWluKCkgewogIGF1dG8gKkRhdGExID0gbmV3IE9iamVjdERhdGExKCJTdHJpbmciKTsJCiAgYXV0byAqRGF0YTIgPSBuZXcgT2JqZWN0RGF0YTIoMTApOwogIGF1dG8gKkkxID0gRmFjdG9yeTxJbml0aWFsaXplcj46OmdlbmVyYXRlKERhdGExKTsKICBhdXRvICpJMiA9IEZhY3Rvcnk8SW5pdGlhbGl6ZXI+OjpnZW5lcmF0ZShEYXRhMik7CiAgcmV0dXJuIDA7Cn0=