fork download
  1. #include <iostream>
  2. #include <stdexcept>
  3. using namespace std;
  4.  
  5.  
  6. class BaseHolder
  7. {
  8. public:
  9. virtual ~BaseHolder(){}
  10. virtual BaseHolder* clone() const = 0;
  11. };
  12.  
  13. template<typename T>
  14. class HoldData : public BaseHolder
  15. {
  16. public:
  17. HoldData(const T& t_) : t(t_){}
  18.  
  19. virtual BaseHolder* clone() const {
  20. return new HoldData<T>(t);
  21. }
  22.  
  23. T getData() {
  24. return t;
  25. }
  26.  
  27. private:
  28. T t;
  29. };
  30.  
  31.  
  32. class Variant
  33. {
  34. public:
  35.  
  36. Variant() : data(0) {}
  37.  
  38. template<typename T>
  39. Variant(const T& t) : data(new HoldData<T>(t)){}
  40.  
  41. Variant(const Variant& other) : data(other.data ? other.data->clone() : 0) {}
  42. ~Variant(){delete data;}
  43.  
  44. template<typename T>
  45. T getData() {
  46. return ((HoldData<T>*)data)->getData();
  47. }
  48.  
  49. private:
  50. BaseHolder* data;
  51.  
  52. private:
  53. Variant& operator=(const Variant& other) { return *this;} // Not allowed
  54. };
  55.  
  56. struct none {};
  57.  
  58. class Container{
  59. public:
  60. Container() : m1_(0), m2_(0), m3_(0){}
  61. ~Container() {
  62. if(m1_)
  63. delete m1_;
  64. if(m2_)
  65. delete m1_;
  66. if(m3_)
  67. delete m1_;
  68. }
  69.  
  70. none extract() { return none();}
  71.  
  72. template<typename T>
  73. void insertM1(T obj) {
  74. m1_ = new Variant(obj);
  75. }
  76.  
  77. template<typename T>
  78. T extractM1() {
  79. if(m1_ != 0)
  80. return m1_->getData<T>();
  81. else
  82. throw std::runtime_error("Element not set");
  83. }
  84.  
  85. // TODO: implement m2 and m3
  86.  
  87. Variant *m1_;
  88. Variant *m2_;
  89. Variant *m3_;
  90. };
  91.  
  92. int main() {
  93.  
  94. Container obj;
  95.  
  96. char M1 = 'Z';
  97. obj.insertM1(M1);
  98.  
  99. char extractedM1 = obj.extractM1<char>();
  100. cout << extractedM1;
  101.  
  102. return 0;
  103. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Z