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


