Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <typeinfo>
  3.  
  4. class BaseHolder {
  5. public:
  6.     virtual ~BaseHolder() {}
  7.     virtual const type_info& type() = 0;
  8. };
  9.  
  10. template<class T>
  11. class ConcreteHolder : public BaseHolder {
  12.  
  13. public:
  14.     T t_;
  15.     explicit ConcreteHolder(const T& t) : t_(t) {}
  16.     const type_info& type() {
  17.         return typeid(T);
  18.     }
  19. };
  20.  
  21.  
  22. class Any {
  23.     BaseHolder* held_;
  24. public:
  25.     template<class T>
  26.     Any() : held_(0) {}
  27.  
  28.     template<class T>
  29.     Any(const T& value) : held_(new ConcreteHolder<T>(value)) {}
  30.  
  31.     template <class U> U cast() const {
  32.         if (typeid(U).hash_code() != (held_->type()).hash_code()) {
  33.             std::cout << "ERROOOOOOOOOOOOOOOOOOOOOOOR" << std::endl;
  34.             return 0;
  35.         }
  36.         return static_cast<ConcreteHolder<U>*> (held_)->t_;
  37.     }
  38.  
  39.     ~Any() {
  40.         delete held_;
  41.     }
  42. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement