#include <iostream>
#include <map>
#include <memory>
#include <typeinfo>
struct Component
{
template<typename T>
T & getAttribute() { return *static_cast<T*>(mAttributes[&typeid(T)].get()); }
template<typename T>
void setAttribute(const T & inValue) { mAttributes[&typeid(T)] = std::shared_ptr<void>(new T(inValue)); }
std::map<const std::type_info*, std::shared_ptr<void> > mAttributes;
};
int main()
{
Component comp;
comp.setAttribute<int>(3);
comp.setAttribute<bool>(false);
comp.setAttribute<std::string>("abc");
std::cout << comp.getAttribute<int>() << std::endl;
std::cout << comp.getAttribute<bool>() << std::endl;
std::cout << comp.getAttribute<std::string>() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dHlwZWluZm8+CgoKc3RydWN0IENvbXBvbmVudAp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgVCAmIGdldEF0dHJpYnV0ZSgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxUKj4obUF0dHJpYnV0ZXNbJnR5cGVpZChUKV0uZ2V0KCkpOyB9CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFQgJiBpblZhbHVlKSB7IG1BdHRyaWJ1dGVzWyZ0eXBlaWQoVCldID0gc3RkOjpzaGFyZWRfcHRyPHZvaWQ+KG5ldyBUKGluVmFsdWUpKTsgfQoKICAgIHN0ZDo6bWFwPGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiwgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+ID4gbUF0dHJpYnV0ZXM7Cn07CgoKaW50IG1haW4oKQp7CglDb21wb25lbnQgY29tcDsKCWNvbXAuc2V0QXR0cmlidXRlPGludD4oMyk7Cgljb21wLnNldEF0dHJpYnV0ZTxib29sPihmYWxzZSk7Cgljb21wLnNldEF0dHJpYnV0ZTxzdGQ6OnN0cmluZz4oImFiYyIpOwoKCXN0ZDo6Y291dCA8PCBjb21wLmdldEF0dHJpYnV0ZTxpbnQ+KCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGNvbXAuZ2V0QXR0cmlidXRlPGJvb2w+KCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGNvbXAuZ2V0QXR0cmlidXRlPHN0ZDo6c3RyaW5nPigpIDw8IHN0ZDo6ZW5kbDsKCn0=