fork download
  1. #include <memory>
  2.  
  3. template<class Type, class Del = std::default_delete<Type> >
  4. class deep_ptr : public std::unique_ptr<Type, Del> {
  5. public:
  6. typedef std::unique_ptr<Type, Del> base;
  7. typedef typename base::element_type element_type;
  8. typedef typename base::deleter_type deleter_type;
  9. typedef typename base::pointer pointer;
  10.  
  11. deep_ptr() : base() {}
  12. //deep_ptr(std::nullptr_t p) : base(p) {} //GCC no has nullptr_t?
  13. explicit deep_ptr(pointer p) : base() {}
  14. deep_ptr(pointer p, const typename std::remove_reference<Del>::type &d) : base(p, d) {} //I faked this, it isn't quite right
  15. deep_ptr(pointer p, typename std::remove_reference<Del>::type&& d): base(p, d) {}
  16. deep_ptr(const deep_ptr& rhs) : base(new Type(*rhs)) {}
  17. template<class Type2, class Del2>
  18. deep_ptr(const deep_ptr<Type2, Del2>& rhs) : base(new Type(*rhs)) {}
  19. deep_ptr(deep_ptr&& rhs) : base(std::move(rhs)) {}
  20. template<class Type2, class Del2>
  21. deep_ptr(deep_ptr<Type2, Del2>&& rhs) : base(std::move(rhs)) {}
  22. deep_ptr& operator=(const deep_ptr& rhs) {base::reset(new Type(*rhs)); return *this;}
  23. template<class Type2, class Del2>
  24. deep_ptr& operator=(const deep_ptr<Type2, Del2>& rhs) {base::reset(new Type(*rhs)); return *this;}
  25. deep_ptr& operator=(deep_ptr&& rhs) {base::reset(rhs.release()); return *this;}
  26. template<class Type2, class Del2>
  27. deep_ptr& operator=(deep_ptr<Type2, Del2>&& rhs) {base::reset(rhs.release()); return *this;}
  28. void swap(deep_ptr& rhs) {base::swap(rhs.ptr);}
  29. friend void swap(deep_ptr& lhs, deep_ptr& rhs) {lhs.swap(rhs.ptr);}
  30. };
  31.  
  32. #include <string>
  33. #include <iostream>
  34.  
  35. struct dog {
  36. deep_ptr<std::string> name;
  37. };
  38.  
  39. int main() {
  40. dog first; //default construct a dog
  41. first.name.reset(new std::string("Fred"));
  42. dog second(first); //copy construct a dog
  43. std::cout << *first.name << ' ' << *second.name << '\n';
  44. second.name->at(3) = 'o';
  45. std::cout << *first.name << ' ' << *second.name << '\n';
  46. second = first; //assign a dog
  47. std::cout << *first.name << ' ' << *second.name << '\n';
  48. }
Success #stdin #stdout 0s 2960KB
stdin
Standard input is empty
stdout
Fred Fred
Fred Freo
Fred Fred