fork download
  1. #include <iostream>
  2.  
  3. struct BaseData {
  4. virtual std::string getValue() = 0;
  5. };
  6.  
  7. struct ObjectData1: public BaseData {
  8. std::string str;
  9. ObjectData1(std::string iStr):str(iStr){}
  10. std::string getValue() override {
  11. return str;
  12. };
  13. };
  14.  
  15. struct ObjectData2: public BaseData {
  16. int Int;
  17. ObjectData2(int iInt):Int(iInt){}
  18. std::string getValue() override {
  19. return std::to_string(Int);
  20. };
  21. };
  22.  
  23. template <typename T>
  24. class Factory {
  25. public:
  26. static T* generate(BaseData *objectData) {
  27. T* Tmp = new T();
  28. Tmp->init(objectData);
  29. return Tmp;
  30. }
  31. };
  32.  
  33. class Initializer: public Factory<Initializer> {
  34. BaseData *objectData;
  35. public:
  36. void init(BaseData *iObjectData) {
  37. objectData = iObjectData;
  38. std::cout << objectData->getValue() << ": " << typeid(*objectData).name() << "\n";
  39. }
  40. };
  41.  
  42. int main() {
  43. auto *Data1 = new ObjectData1("String");
  44. auto *Data2 = new ObjectData2(10);
  45. auto *I1 = Factory<Initializer>::generate(Data1);
  46. auto *I2 = Factory<Initializer>::generate(Data2);
  47. return 0;
  48. }
Success #stdin #stdout 0s 4504KB
stdin
Standard input is empty
stdout
String: 11ObjectData1
10: 11ObjectData2