Art_Uspen

Untitled

Oct 27th, 2021
713
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma once
  2. #include <memory>
  3.  
  4. class Any {
  5. public:
  6.     class InnerBase {
  7.     public:
  8.         virtual std::unique_ptr<InnerBase> Clone() = 0;
  9.         virtual ~InnerBase() = default;
  10.     };
  11.     template <typename T>
  12.     class Inner : public InnerBase {
  13.     public:
  14.         Inner(T&& val) : val_(std::forward<T>(val)) {
  15.         }
  16.         std::unique_ptr<InnerBase> Clone() override {
  17.             return std::make_unique<Inner<T>>(std::forward<T>(val_));
  18.         }
  19.         T val_;
  20.     };
  21.     template <typename T>
  22.     Any(T&& value) : ptr_(new Inner<T>(std::forward<T>(value))) {
  23.     }
  24.     Any() = default;
  25.  
  26.     //    template <class T>
  27.     //    Any(const T& value) : ptr_(new Inner<T>(value)) {
  28.     //    }
  29.  
  30.     Any(const Any& rhs) {
  31.         ptr_ = (*rhs.ptr_).Clone();
  32.     }
  33.  
  34.     template <class T>
  35.     Any& operator=(const T& value) {
  36.         (Any(value)).Swap(*this);
  37.         return *this;
  38.     }
  39.     Any& operator=(const Any& rhs) {
  40.         if (this == &rhs) {
  41.             return *this;
  42.         }
  43.         (Any(rhs)).Swap(*this);
  44.         return *this;
  45.     }
  46.     ~Any() {
  47.     }
  48.  
  49.     bool Empty() const {
  50.         if (!ptr_) {
  51.             return true;
  52.         } else {
  53.             return false;
  54.         }
  55.     }
  56.  
  57.     void Clear() {
  58.         ptr_.reset();
  59.     }
  60.     void Swap(Any& rhs) {
  61.         ptr_.swap(rhs.ptr_);
  62.     }
  63.  
  64.     template <class T>
  65.     const T& GetValue() const {
  66.         return dynamic_cast<Inner<T>&>(*ptr_).val_;
  67.     }
  68.  
  69. private:
  70.     std::unique_ptr<InnerBase> ptr_;
  71. };
RAW Paste Data