daily pastebin goal
59%
SHARE
TWEET

Untitled

a guest Jun 27th, 2015 70 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma once
  2.  
  3. #include "boost/any.hpp"
  4.  
  5. template<class C>
  6. class value_ptr // Holds a ptr that will be treated like a value. Basically an any with a limit on that it must be derived from C
  7. {
  8. public:
  9.         // Constructors
  10.         value_ptr() : ptr(nullptr) {}
  11.         value_ptr(const value_ptr&) = default;
  12.         value_ptr(value_ptr&& other) : holder(std::move(other.holder)), ptr(other.ptr) {}
  13.  
  14.         template<class Cx>
  15.         value_ptr(const Cx& other) : holder(other)
  16.         {
  17.                 static_assert(std::is_base_of<C, Cx>::value, "Type must be derived from C!");
  18.                 ptr = boost::any_cast<Cx>(&holder);
  19.         }
  20.  
  21.         template<class Cx>
  22.         value_ptr(Cx && other) : holder(std::move(other))
  23.         {
  24.                 static_assert(std::is_base_of<C, Cx>::value, "Type must be derived from C!");
  25.                 ptr = boost::any_cast<Cx>(&holder);
  26.         }
  27.  
  28.         // Assignment operators
  29.         value_ptr& operator=(const value_ptr&) = default;
  30.         value_ptr& operator=(value_ptr&& other)
  31.         {
  32.                 holder = std::move(other.holder);
  33.                 ptr = ptr;
  34.         }
  35.  
  36.         template<class Cx>
  37.         value_ptr& operator=(const Cx& other)
  38.         {
  39.                 static_assert(std::is_base_of<C, Cx>::value, "Type must be derived from C!");
  40.                 holder = other;
  41.                 ptr = boost::any_cast<Cx>(&holder);
  42.         }
  43.  
  44.         template<class Cx>
  45.         value_ptr& operator=(Cx && other)
  46.         {
  47.                 static_assert(std::is_base_of<C, Cx>::value, "Type must be derived from C!");
  48.                 holder = std::move(other);
  49.                 ptr = boost::any_cast<Cx>(&holder);
  50.         }
  51.  
  52.         C& operator*() { return *ptr; }
  53.         C* operator->() { return ptr; }
  54.  
  55.         bool empty() const { return holder.empty(); }
  56.         const std::type_info& type() const { return holder.type(); }
  57. private:
  58.         C* ptr;
  59.         boost::any holder;
  60. };
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top