#include <stdlib.h>
#include <iostream>
#include <map>
#include <typeindex>
using namespace std;
struct Variant{
template <class T>
static Variant* Create(){
Variant *v = new Variant();
v->m_data = malloc(sizeof(T));
v->m_size = sizeof(T);
return v;
}
~Variant(){
free( m_data);
}
template <class T>
T &get(){
return *reinterpret_cast<T*>(m_data);
}
//copy ctor, etc...
private:
void *m_data;
size_t m_size;
};
struct Foo{
template<class T>
T &get(){
static const char addr = '\0';
auto it = m_data.find(&addr);
if(it != m_data.end()){
return it->second->get<T>();
}
Variant *val = Variant::Create<T>();
m_data[&addr] = val;
return val->get<T>();
}
private:
map<const char*,Variant*> m_data;
};
int main() {
Foo a;
Foo b;
a.get<int>() = 3;
a.get<float>() = -5.5f;
b.get<int>() = 4;
b.get<float>() = -6.5f;
cout << a.get<int>() << "," << a.get<float>() <<endl;
cout << b.get<int>() << "," << b.get<float>() <<endl;
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDx0eXBlaW5kZXg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFZhcmlhbnR7Cgl0ZW1wbGF0ZSA8Y2xhc3MgVD4KCXN0YXRpYyBWYXJpYW50KiBDcmVhdGUoKXsKCQlWYXJpYW50ICp2ID0gbmV3IFZhcmlhbnQoKTsKCQl2LT5tX2RhdGEgPSBtYWxsb2Moc2l6ZW9mKFQpKTsKCQl2LT5tX3NpemUgPSBzaXplb2YoVCk7CgkJcmV0dXJuIHY7Cgl9Cgl+VmFyaWFudCgpewoJCWZyZWUoIG1fZGF0YSk7Cgl9CgkKCXRlbXBsYXRlIDxjbGFzcyBUPgoJVCAmZ2V0KCl7CgkJcmV0dXJuICpyZWludGVycHJldF9jYXN0PFQqPihtX2RhdGEpOwoJfQoJCgkvL2NvcHkgY3RvciwgZXRjLi4uCnByaXZhdGU6Cgl2b2lkICptX2RhdGE7CglzaXplX3QgbV9zaXplOwp9OwoKc3RydWN0IEZvb3sKCXRlbXBsYXRlPGNsYXNzIFQ+CglUICZnZXQoKXsKCQlzdGF0aWMgY29uc3QgY2hhciBhZGRyID0gJ1wwJzsKCQlhdXRvIGl0ID0gbV9kYXRhLmZpbmQoJmFkZHIpOwoJCWlmKGl0ICE9IG1fZGF0YS5lbmQoKSl7CgkJCXJldHVybiBpdC0+c2Vjb25kLT5nZXQ8VD4oKTsKCQl9CgkJVmFyaWFudCAqdmFsID0gVmFyaWFudDo6Q3JlYXRlPFQ+KCk7CgkJbV9kYXRhWyZhZGRyXSA9IHZhbDsKCQlyZXR1cm4gdmFsLT5nZXQ8VD4oKTsKCX0KcHJpdmF0ZToKCW1hcDxjb25zdCBjaGFyKixWYXJpYW50Kj4gIG1fZGF0YTsKfTsKCmludCBtYWluKCkgewoJRm9vIGE7CglGb28gYjsKCQoJYS5nZXQ8aW50PigpID0gMzsKCWEuZ2V0PGZsb2F0PigpID0gLTUuNWY7CgkKCWIuZ2V0PGludD4oKSA9IDQ7CgliLmdldDxmbG9hdD4oKSA9IC02LjVmOwoJCgljb3V0IDw8IGEuZ2V0PGludD4oKSA8PCAiLCIgPDwgYS5nZXQ8ZmxvYXQ+KCkgPDxlbmRsOwoJY291dCA8PCBiLmdldDxpbnQ+KCkgPDwgIiwiIDw8IGIuZ2V0PGZsb2F0PigpIDw8ZW5kbDsKCQoJcmV0dXJuIDA7Cn0=