#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;
}