48 template<
typename T2,
typename ClonerT2>
49 friend class clone_ptr;
57 cloner(cloner), ptr(ptr) {}
59 clone_ptr(
const clone_ptr& other):
60 cloner(other.cloner), ptr(cloner(other.ptr)) {}
62 clone_ptr(clone_ptr&& other):
63 cloner(std::move(other.cloner)), ptr(std::move(other.ptr)) {
67 clone_ptr& operator=(
const clone_ptr& other) {
68 cloner = other.cloner;
69 ptr = cloner(other.ptr);
73 clone_ptr& operator=(clone_ptr&& other) {
74 cloner = std::move(other.cloner);
75 ptr = std::move(other.ptr);
80 template<
typename T2,
typename ClonerT2>
81 clone_ptr(
const clone_ptr<T2, ClonerT2>& other):
82 cloner(other.cloner), ptr(cloner(other.ptr)) {}
84 template<
typename T2,
typename ClonerT2>
85 clone_ptr(clone_ptr<T2, ClonerT2>&& other):
86 cloner(std::move(other.cloner)), ptr(std::move(other.ptr)) {
90 template<
typename T2,
typename ClonerT2>
91 clone_ptr& operator=(
const clone_ptr<T2, ClonerT2>& other) {
92 cloner = other.cloner;
93 ptr = cloner(other.ptr);
97 template<
typename T2,
typename ClonerT2>
98 clone_ptr& operator=(clone_ptr<T2, ClonerT2>&& other) {
99 cloner = std::move(other.cloner);
100 ptr = std::move(other.ptr);
109 const T* get()
const {
123 const T& operator*()
const {
131 const T* operator->()
const {
136 if (ptr !=
nullptr) {