#include <unordered_map>
#include <memory>
#include <iostream>
class Data {
public:
virtual ~Data(){}
virtual int Size() = 0;
};
class Struct : public Data {
std::unordered_map<std::string, std::unique_ptr<Data>> m;
public:
Struct & Add(const std::string& name, std::unique_ptr<Data> x) {
m[name] = std::move(x);
return *this;
}
void Print() {
for(const auto& tmp : m )
std::cout << tmp.first << " " << tmp.second->Size() << "\n";
}
int Size() override {
int sum = 0;
for (const auto& tmp : m)
sum += tmp.second->Size();
return sum;
}
};
class IntData : public Data {
public:
int Size( ) override { return 4; }
};
class DoubleData : public Data {
public:
DoubleData( ) { }
int Size( ) override { return 8; }
};
int main() {
Struct a;
a.Add("Integer", std::make_unique<IntData>() );
a.Print();
}
I2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIERhdGEgewogICAgcHVibGljOgogICAgICAgIHZpcnR1YWwgfkRhdGEoKXt9CiAgICAgICAgdmlydHVhbCBpbnQgU2l6ZSgpID0gMDsKfTsKCmNsYXNzIFN0cnVjdCA6IHB1YmxpYyBEYXRhIHsKICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8RGF0YT4+IG07CiAgICBwdWJsaWM6IAogICAgICAgIFN0cnVjdCAmIEFkZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp1bmlxdWVfcHRyPERhdGE+IHgpIHsKICAgICAgICAgICAgbVtuYW1lXSA9IHN0ZDo6bW92ZSh4KTsKICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KICAgICAgICB2b2lkIFByaW50KCkgewogICAgICAgICAgICBmb3IoY29uc3QgYXV0byYgdG1wIDogbSApCiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgdG1wLmZpcnN0IDw8ICIgICAgIiA8PCB0bXAuc2Vjb25kLT5TaXplKCkgPDwgIlxuIjsKICAgICAgICB9CiAgICAgICAgaW50IFNpemUoKSBvdmVycmlkZSB7CiAgICAgICAgICAgIGludCBzdW0gPSAwOwogICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IG0pCiAgICAgICAgICAgICAgICBzdW0gKz0gdG1wLnNlY29uZC0+U2l6ZSgpOwogICAgICAgICAgICByZXR1cm4gc3VtOwogICAgICAgIH0KfTsKCmNsYXNzIEludERhdGEgOiBwdWJsaWMgRGF0YSB7CiAgICBwdWJsaWM6CiAgICAgICAgaW50IFNpemUoICkgb3ZlcnJpZGUgeyByZXR1cm4gNDsgfQp9OwoKY2xhc3MgRG91YmxlRGF0YSA6IHB1YmxpYyBEYXRhIHsKICAgIHB1YmxpYzoKICAgICAgICBEb3VibGVEYXRhKCApIHsgfQogICAgICAgIGludCBTaXplKCApIG92ZXJyaWRlIHsgcmV0dXJuIDg7IH0KfTsKCmludCBtYWluKCkgewogICAgU3RydWN0ICBhOwogICAgYS5BZGQoIkludGVnZXIiLCBzdGQ6Om1ha2VfdW5pcXVlPEludERhdGE+KCkgKTsKICAgIGEuUHJpbnQoKTsKfQo=