#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Receiver
{
public:
virtual ~Receiver() = default;
virtual void receiveDataA(int intData, float floatData) = 0;
virtual void receiveDataB(string stringData, double doubleData) = 0;
};
class BaseData
{
public:
using Ptr = unique_ptr<BaseData>;
virtual ~BaseData() = default;
virtual void receiver(Receiver& receiver) = 0;
};
class DataA : public BaseData
{
public:
DataA(int intData, float floatData) : mIntData{intData}, mFloatData{floatData} {}
void receiver(Receiver& receiver) override
{
receiver.receiveDataA(mIntData, mFloatData);
}
private:
int mIntData;
float mFloatData;
};
class DataB : public BaseData
{
public:
DataB(string stringData, double doubleData) : mStringData{stringData}, mDoubleData{doubleData} {}
void receiver(Receiver& receiver) override
{
receiver.receiveDataB(mStringData, mDoubleData);
}
private:
string mStringData;
double mDoubleData;
};
struct Object : public Receiver
{
void receive(BaseData& data)
{
data.receiver(*this);
}
void receiveDataA(int intData, float floatData) override
{
cout << "receiveDataA[" << intData << ',' << floatData << "]\n";
}
void receiveDataB(string stringData, double doubleData) override
{
cout << "receiveDataB[" << stringData << ',' << doubleData << "]\n";
}
};
int main()
{
vector<BaseData::Ptr> mData;
mData.push_back(make_unique<DataA>(100, 1.));
mData.push_back(make_unique<DataB>("Hello", 2.f));
mData.push_back(make_unique<DataB>("World!", 150.f));
mData.push_back(make_unique<DataA>(200, 50.));
Object object;
for (auto& data : mData)
{
object.receive(*data);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFJlY2VpdmVyCnsKcHVibGljOgoJdmlydHVhbCB+UmVjZWl2ZXIoKSA9IGRlZmF1bHQ7CgoJdmlydHVhbCB2b2lkIHJlY2VpdmVEYXRhQShpbnQgaW50RGF0YSwgZmxvYXQgZmxvYXREYXRhKSA9IDA7Cgl2aXJ0dWFsIHZvaWQgcmVjZWl2ZURhdGFCKHN0cmluZyBzdHJpbmdEYXRhLCBkb3VibGUgZG91YmxlRGF0YSkgPSAwOwp9OwoKY2xhc3MgQmFzZURhdGEKewpwdWJsaWM6CiAgICB1c2luZyBQdHIgPSB1bmlxdWVfcHRyPEJhc2VEYXRhPjsKCiAgICB2aXJ0dWFsIH5CYXNlRGF0YSgpID0gZGVmYXVsdDsKCiAgICB2aXJ0dWFsIHZvaWQgcmVjZWl2ZXIoUmVjZWl2ZXImIHJlY2VpdmVyKSA9IDA7Cn07CgpjbGFzcyBEYXRhQSA6IHB1YmxpYyBCYXNlRGF0YQp7CnB1YmxpYzoKICAgIERhdGFBKGludCBpbnREYXRhLCBmbG9hdCBmbG9hdERhdGEpIDogbUludERhdGF7aW50RGF0YX0sIG1GbG9hdERhdGF7ZmxvYXREYXRhfSB7fQoKICAgIHZvaWQgcmVjZWl2ZXIoUmVjZWl2ZXImIHJlY2VpdmVyKSBvdmVycmlkZQogICAgewoJCXJlY2VpdmVyLnJlY2VpdmVEYXRhQShtSW50RGF0YSwgbUZsb2F0RGF0YSk7CiAgICB9Cgpwcml2YXRlOgogICAgaW50IG1JbnREYXRhOwogICAgZmxvYXQgbUZsb2F0RGF0YTsKfTsKCmNsYXNzIERhdGFCIDogcHVibGljIEJhc2VEYXRhCnsKcHVibGljOgogICAgRGF0YUIoc3RyaW5nIHN0cmluZ0RhdGEsIGRvdWJsZSBkb3VibGVEYXRhKSA6IG1TdHJpbmdEYXRhe3N0cmluZ0RhdGF9LCBtRG91YmxlRGF0YXtkb3VibGVEYXRhfSB7fQoKICAgIHZvaWQgcmVjZWl2ZXIoUmVjZWl2ZXImIHJlY2VpdmVyKSBvdmVycmlkZQogICAgewoJCXJlY2VpdmVyLnJlY2VpdmVEYXRhQihtU3RyaW5nRGF0YSwgbURvdWJsZURhdGEpOwogICAgfQoKcHJpdmF0ZToKICAgIHN0cmluZyBtU3RyaW5nRGF0YTsKICAgIGRvdWJsZSBtRG91YmxlRGF0YTsKfTsKCnN0cnVjdCBPYmplY3QgOiBwdWJsaWMgUmVjZWl2ZXIKewogICAgdm9pZCByZWNlaXZlKEJhc2VEYXRhJiBkYXRhKQogICAgewoJCWRhdGEucmVjZWl2ZXIoKnRoaXMpOwogICAgfQoKICAgIHZvaWQgcmVjZWl2ZURhdGFBKGludCBpbnREYXRhLCBmbG9hdCBmbG9hdERhdGEpIG92ZXJyaWRlCiAgICB7CgkJY291dCA8PCAicmVjZWl2ZURhdGFBWyIgPDwgaW50RGF0YSA8PCAnLCcgPDwgZmxvYXREYXRhIDw8ICJdXG4iOwogICAgfQoKICAgIHZvaWQgcmVjZWl2ZURhdGFCKHN0cmluZyBzdHJpbmdEYXRhLCBkb3VibGUgZG91YmxlRGF0YSkgb3ZlcnJpZGUKICAgIHsKCQljb3V0IDw8ICJyZWNlaXZlRGF0YUJbIiA8PCBzdHJpbmdEYXRhIDw8ICcsJyA8PCBkb3VibGVEYXRhIDw8ICJdXG4iOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8QmFzZURhdGE6OlB0cj4gbURhdGE7CiAgICBtRGF0YS5wdXNoX2JhY2sobWFrZV91bmlxdWU8RGF0YUE+KDEwMCwgMS4pKTsKICAgIG1EYXRhLnB1c2hfYmFjayhtYWtlX3VuaXF1ZTxEYXRhQj4oIkhlbGxvIiwgMi5mKSk7CiAgICBtRGF0YS5wdXNoX2JhY2sobWFrZV91bmlxdWU8RGF0YUI+KCJXb3JsZCEiLCAxNTAuZikpOwogICAgbURhdGEucHVzaF9iYWNrKG1ha2VfdW5pcXVlPERhdGFBPigyMDAsIDUwLikpOwoKICAgIE9iamVjdCBvYmplY3Q7CgogICAgZm9yIChhdXRvJiBkYXRhIDogbURhdGEpCiAgICB7CgkJb2JqZWN0LnJlY2VpdmUoKmRhdGEpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==