fork download
  1. #include <stdlib.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <typeindex>
  5.  
  6. using namespace std;
  7.  
  8. struct Variant{
  9. template <class T>
  10. static Variant* Create(){
  11. Variant *v = new Variant();
  12. v->m_data = malloc(sizeof(T));
  13. v->m_size = sizeof(T);
  14. return v;
  15. }
  16. ~Variant(){
  17. free( m_data);
  18. }
  19.  
  20. template <class T>
  21. T &get(){
  22. return *reinterpret_cast<T*>(m_data);
  23. }
  24.  
  25. //copy ctor, etc...
  26. private:
  27. void *m_data;
  28. size_t m_size;
  29. };
  30.  
  31. struct Foo{
  32. template<class T>
  33. T &get(){
  34. static const char addr = '\0';
  35. auto it = m_data.find(&addr);
  36. if(it != m_data.end()){
  37. return it->second->get<T>();
  38. }
  39. Variant *val = Variant::Create<T>();
  40. m_data[&addr] = val;
  41. return val->get<T>();
  42. }
  43. private:
  44. map<const char*,Variant*> m_data;
  45. };
  46.  
  47. int main() {
  48. Foo a;
  49. Foo b;
  50.  
  51. a.get<int>() = 3;
  52. a.get<float>() = -5.5f;
  53.  
  54. b.get<int>() = 4;
  55. b.get<float>() = -6.5f;
  56.  
  57. cout << a.get<int>() << "," << a.get<float>() <<endl;
  58. cout << b.get<int>() << "," << b.get<float>() <<endl;
  59.  
  60. return 0;
  61. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
3,-5.5
4,-6.5