Advertisement
anechka_ne_plach

any1

Oct 28th, 2021
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #pragma once
  2. #include <memory>
  3. #include <type_traits>
  4. #include <iostream>
  5.  
  6. class Any {
  7. public:
  8.     class InnerBase {
  9.     public:
  10.         using Pointer = std::unique_ptr<InnerBase>;
  11.         virtual InnerBase* Clone() const = 0;
  12.         virtual ~InnerBase() = default;
  13.     };
  14.  
  15.     template <class T>
  16.     class Inner : public InnerBase {
  17.     public:
  18.         Inner(const T& value) : value_(value) {
  19.         }
  20.         virtual InnerBase* Clone() const override {
  21.             return new Inner(value_);
  22.         }
  23.         T value_;
  24.     };
  25.  
  26.     Any() : ptr_(nullptr) {
  27.     }
  28.  
  29.     template <class T>
  30.     Any& operator=(const T& value) {
  31.         ptr_.reset(new Inner<T>(value));
  32.         return *this;
  33.     }
  34.  
  35.     Any(const Any& rhs) {
  36.         if (rhs.ptr_ == nullptr) {
  37.             ptr_ = nullptr;
  38.         } else {
  39.             ptr_.reset(rhs.ptr_->Clone());
  40.         }
  41.     }
  42.  
  43.     Any& operator=(const Any& rhs) {
  44.         if (ptr_ != rhs.ptr_) {
  45.             Any copy(rhs);
  46.             this->Swap(copy);
  47.         }
  48.         return *this;
  49.     }
  50.  
  51.     template <class T>
  52.     Any(const T& value) : ptr_(new Inner<T>(value)) {
  53.     }
  54.  
  55.     ~Any() {
  56.         ptr_.release();
  57.     }
  58.  
  59.     bool Empty() const {
  60.         return (ptr_ == nullptr);
  61.     }
  62.  
  63.     void Clear() {
  64.         if (ptr_ != nullptr) {
  65.             ptr_.release();
  66.         }
  67.     }
  68.  
  69.     void Swap(Any& rhs) {
  70.         std::swap(ptr_, rhs.ptr_);
  71.     }
  72.  
  73.     template <class T>
  74.     const T& GetValue() const {
  75.         return dynamic_cast<Inner<T>&>(*ptr_).value_;
  76.     }
  77.  
  78. private:
  79.     InnerBase::Pointer ptr_;
  80. };
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement