#include <iostream>
#include <typeinfo>
#include <typeindex>
#include <unordered_map>
struct Base {
virtual ~Base() = default;
};
struct E1 : Base {int i;};
struct E2 : Base {};
struct Data {
std::size_t id;
std::size_t size;
};
struct CCollection
{
template <typename T>
std::size_t toId() {
auto it = info.find(typeid(T));
if (it == info.end()) {
it = info.insert({typeid(T), {count++, sizeof(T)}}).first;
}
return it->second.id;
}
std::size_t sizeOf(const Base& base) const {
const auto& data = info.at(typeid(base));
return data.size;
}
std::size_t count = 0;
std::unordered_map<std::type_index, Data> info;
};
int main()
{
CCollection c;
const auto e1Id = c.toId<E1>();
const auto e1Size = c.sizeOf(E1{});
std::cout << e1Id << " " << e1Size << std::endl;
const auto e2Id = c.toId<E2>();
const auto e2Size = c.sizeOf(E2{});
std::cout << e2Id << " " << e2Size << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDx0eXBlaW5kZXg+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgoKCnN0cnVjdCBCYXNlIHsKICAgIHZpcnR1YWwgfkJhc2UoKSA9IGRlZmF1bHQ7ICAKfTsKCnN0cnVjdCBFMSA6IEJhc2Uge2ludCBpO307CnN0cnVjdCBFMiA6IEJhc2Uge307CgpzdHJ1Y3QgRGF0YSB7CiAgICBzdGQ6OnNpemVfdCBpZDsKICAgIHN0ZDo6c2l6ZV90IHNpemU7Cn07CgpzdHJ1Y3QgQ0NvbGxlY3Rpb24KewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBzdGQ6OnNpemVfdCB0b0lkKCkgewogICAgICAgIGF1dG8gaXQgPSBpbmZvLmZpbmQodHlwZWlkKFQpKTsKICAgICAgICBpZiAoaXQgPT0gaW5mby5lbmQoKSkgewogICAgICAgICAgICBpdCA9IGluZm8uaW5zZXJ0KHt0eXBlaWQoVCksIHtjb3VudCsrLCBzaXplb2YoVCl9fSkuZmlyc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdC0+c2Vjb25kLmlkOyAgIAogICAgfQoKICAgIHN0ZDo6c2l6ZV90IHNpemVPZihjb25zdCBCYXNlJiBiYXNlKSBjb25zdCB7CiAgICAgICAgY29uc3QgYXV0byYgZGF0YSA9IGluZm8uYXQodHlwZWlkKGJhc2UpKTsKICAgICAgICByZXR1cm4gZGF0YS5zaXplOyAgIAogICAgfQoKICAgIHN0ZDo6c2l6ZV90IGNvdW50ID0gMDsKICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnR5cGVfaW5kZXgsIERhdGE+IGluZm87Cn07CgppbnQgbWFpbigpCnsKICAgIENDb2xsZWN0aW9uIGM7CiAgICAKICAgIGNvbnN0IGF1dG8gZTFJZCA9IGMudG9JZDxFMT4oKTsKICAgIGNvbnN0IGF1dG8gZTFTaXplID0gYy5zaXplT2YoRTF7fSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCBlMUlkIDw8ICIgIiA8PCBlMVNpemUgPDwgc3RkOjplbmRsOwoKICAgIGNvbnN0IGF1dG8gZTJJZCA9IGMudG9JZDxFMj4oKTsKICAgIGNvbnN0IGF1dG8gZTJTaXplID0gYy5zaXplT2YoRTJ7fSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCBlMklkIDw8ICIgIiA8PCBlMlNpemUgPDwgc3RkOjplbmRsOwoKfQo=