c++ - design headache with unique_ptr -
say have class foo:
class foo { public: ... }; foo has instance method either transforms foo instance foo instance, or returns same foo instance:
<some appropriate pointer type foo> foo::trytotransform() { if (canbetransformed()) { <delete foo instance>; return <new instance of foo>; } else { return <this instance of foo>; } } client code:
<some appropriate pointer type foo> foo = ...; ... foo = foo->trytotransform(); this easy naked pointers:
foo* foo::trytotransform() { if (canbetransformed()) { delete this; return new foo(...); } else { return this; } } foo* foo = ...; ... foo = foo->trytotransform(); but if client code uses unique_ptr instead of naked pointer? is, ideally client code this:
unique_ptr<foo> foo = ...; ... foo = foo->trytotransform(); how should foo::trytotransform() defined in order enable such (or similar) client code?
because trytotransform function member function, caller retains ownership of unique_ptr. therefore impossible (without dirty tricks) delete caller's unique_ptr inside member function.
therefore, need static function takes ownership of unique_ptr:
class foo { static unique_ptr<foo> trytotransform(unique_ptr<foo> ptr) { if(...) { return unique_ptr<foo>(new foo()); // old ptr destroyed } else { return ptr; } }; call as
unique_ptr<foo> foo = ...; ... foo = foo::trytotransform(move(foo)); this works having trytotransform take ownership of unique_ptr. able destroy pointer wishes.
Comments
Post a Comment