Advertisement
Guest User

Untitled

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