fork(1) download
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. enum class CUSTOM_TYPE : std::uint32_t
  9. {
  10. CHAR_TYPE,
  11. INT_TYPE,
  12. FLOAT_TYPE,
  13. DOUBLE_TYPE,
  14. CLASS_TYPE
  15. };
  16.  
  17. struct Holder
  18. {
  19. CUSTOM_TYPE type;
  20. std::unique_ptr<void, std::function<void(void*)>> data;
  21.  
  22. template<typename T>
  23. Holder(CUSTOM_TYPE type, T* data_ptr)
  24. {
  25. auto deleter = [](void* data) {
  26. delete static_cast<T*>(data);
  27. };
  28.  
  29. this->type = type;
  30. this->data = std::unique_ptr<void, std::function<void(void*)>>(data_ptr, deleter);
  31. }
  32.  
  33. template<typename T>
  34. T* get()
  35. {
  36. return static_cast<T *>(this->data.get());
  37. }
  38. };
  39.  
  40. class Test
  41. {
  42. private:
  43. std::string word;
  44.  
  45. public:
  46. Test(std::string word) : word(word) { std::cout<<"CONSTRUCTED\n"; }
  47. ~Test() { std::cout<<"DESTRUCTED\n"; }
  48.  
  49. void print()
  50. {
  51. std::cout<<this->word<<"\n";
  52. }
  53. };
  54.  
  55.  
  56. int main() {
  57.  
  58. std::vector<Holder> container;
  59. container.push_back(Holder{CUSTOM_TYPE::CHAR_TYPE, new char('A')});
  60. container.emplace_back(Holder{CUSTOM_TYPE::CHAR_TYPE, new char('B')});
  61. container.emplace_back(Holder{CUSTOM_TYPE::INT_TYPE, new int(1024)});
  62. container.emplace_back(Holder{CUSTOM_TYPE::FLOAT_TYPE, new float(98.98397)});
  63. container.emplace_back(Holder{CUSTOM_TYPE::DOUBLE_TYPE, new double(99.9942999997)});
  64. container.emplace_back(Holder{CUSTOM_TYPE::CLASS_TYPE, new Test("HELLO")});
  65. container.emplace_back(Holder{CUSTOM_TYPE::CLASS_TYPE, new Test("WORLD")});
  66.  
  67. for (Holder &h : container)
  68. {
  69. switch(h.type)
  70. {
  71. case CUSTOM_TYPE::CHAR_TYPE: {
  72. std::cout<<*h.get<char>()<<"\n";
  73. }
  74. break;
  75.  
  76. case CUSTOM_TYPE::INT_TYPE: {
  77. std::cout<<*h.get<int>()<<"\n";
  78. }
  79. break;
  80.  
  81. case CUSTOM_TYPE::FLOAT_TYPE: {
  82. std::cout<<*h.get<float>()<<"\n";
  83. }
  84. break;
  85.  
  86. case CUSTOM_TYPE::DOUBLE_TYPE: {
  87. std::cout<<*h.get<double>()<<"\n";
  88. }
  89. break;
  90.  
  91. case CUSTOM_TYPE::CLASS_TYPE: {
  92. h.get<Test>()->print();
  93. }
  94. break;
  95. }
  96. }
  97.  
  98. return 0;
  99. }
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
CONSTRUCTED
CONSTRUCTED
A
B
1024
98.984
99.9943
HELLO
WORLD
DESTRUCTED
DESTRUCTED