fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4.  
  5. using namespace std;
  6.  
  7. class Receiver
  8. {
  9. public:
  10. virtual ~Receiver() = default;
  11.  
  12. virtual void receiveDataA(int intData, float floatData) = 0;
  13. virtual void receiveDataB(string stringData, double doubleData) = 0;
  14. };
  15.  
  16. class BaseData
  17. {
  18. public:
  19. using Ptr = unique_ptr<BaseData>;
  20.  
  21. virtual ~BaseData() = default;
  22.  
  23. virtual void receiver(Receiver& receiver) = 0;
  24. };
  25.  
  26. class DataA : public BaseData
  27. {
  28. public:
  29. DataA(int intData, float floatData) : mIntData{intData}, mFloatData{floatData} {}
  30.  
  31. void receiver(Receiver& receiver) override
  32. {
  33. receiver.receiveDataA(mIntData, mFloatData);
  34. }
  35.  
  36. private:
  37. int mIntData;
  38. float mFloatData;
  39. };
  40.  
  41. class DataB : public BaseData
  42. {
  43. public:
  44. DataB(string stringData, double doubleData) : mStringData{stringData}, mDoubleData{doubleData} {}
  45.  
  46. void receiver(Receiver& receiver) override
  47. {
  48. receiver.receiveDataB(mStringData, mDoubleData);
  49. }
  50.  
  51. private:
  52. string mStringData;
  53. double mDoubleData;
  54. };
  55.  
  56. struct Object : public Receiver
  57. {
  58. void receive(BaseData& data)
  59. {
  60. data.receiver(*this);
  61. }
  62.  
  63. void receiveDataA(int intData, float floatData) override
  64. {
  65. cout << "receiveDataA[" << intData << ',' << floatData << "]\n";
  66. }
  67.  
  68. void receiveDataB(string stringData, double doubleData) override
  69. {
  70. cout << "receiveDataB[" << stringData << ',' << doubleData << "]\n";
  71. }
  72. };
  73.  
  74. int main()
  75. {
  76. vector<BaseData::Ptr> mData;
  77. mData.push_back(make_unique<DataA>(100, 1.));
  78. mData.push_back(make_unique<DataB>("Hello", 2.f));
  79. mData.push_back(make_unique<DataB>("World!", 150.f));
  80. mData.push_back(make_unique<DataA>(200, 50.));
  81.  
  82. Object object;
  83.  
  84. for (auto& data : mData)
  85. {
  86. object.receive(*data);
  87. }
  88.  
  89. return 0;
  90. }
  91.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
receiveDataA[100,1]
receiveDataB[Hello,2]
receiveDataB[World!,150]
receiveDataA[200,50]