Advertisement
anechka_ne_plach

Untitled

Oct 28th, 2021
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 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.         virtual ~InnerBase() = default;
  11.     };
  12.  
  13.     template <class T>
  14.     class Inner : public InnerBase {
  15.     public:
  16.         Inner(const T& value) : value_(value) {
  17.         }
  18.         T value_;
  19.     };
  20.  
  21.     Any() {
  22.     }
  23.  
  24.     template <class T>
  25.     Any& operator=(const T& value) {
  26.         ptr_.reset(new Inner<T>(value));
  27.         return *this;
  28.     }
  29.  
  30.     Any(const Any& rhs) : ptr_(new Inner<decltype(*(rhs.ptr_.get()))>(*(rhs.ptr_.get()))) {
  31.     }
  32.  
  33.     Any& operator=(const Any& rhs) {
  34.         if (ptr_ != rhs.ptr_) {
  35.             Any copy(rhs);
  36.             Swap(copy);
  37.         }
  38.         return *this;
  39.     }
  40.  
  41.     template <class T>
  42.     Any(T&& value) : ptr_(new Inner<T>(std::forward<T>(value))) {
  43.     }
  44.  
  45.     ~Any() {
  46.         ptr_.release();
  47.     }
  48.  
  49.     bool Empty() const {
  50.         return (ptr_ == nullptr);
  51.     }
  52.  
  53.     void Clear() {
  54.         ptr_.release();
  55.     }
  56.  
  57.     void Swap(Any& rhs) {
  58.         std::swap(ptr_, rhs.ptr_);
  59.     }
  60.  
  61.     template <class T>
  62.     const T& GetValue() const {
  63.         std::cerr << __PRETTY_FUNCTION__ << std::endl;
  64.         if (std::is_same_v<T, decltype(*(ptr_.get()))>) {
  65.             std::cerr << "yay\n";
  66.         }
  67.         try {
  68.             dynamic_cast<Inner<T>&>(*ptr_).value_;
  69.         } catch (...) {
  70.             throw std::bad_cast();
  71.         }
  72.         return dynamic_cast<Inner<T>&>(*ptr_).value_;
  73.     }
  74. private:
  75.     std::unique_ptr<InnerBase> ptr_ = nullptr;
  76. };
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement