
In this post Peter Dimov shows a solution for the covariant return type problem when using shared_ptr: http://lists.boost.org/boost-users/2003/02/2996.php I'm interested in the free function solution he provides:
[snip] you can use the usual pattern from the no-covariant-return days:
class B { virtual shared_ptr<B> do_clone() const = 0; };
class X: public B { virtual shared_ptr<B> do_clone() const { return shared_ptr<X>(new X(*this)); }
public:
shared_ptr<X> clone() const { shared_ptr<X> px = dynamic_pointer_cast<X>(this->do_clone()); assert(px); return px; } };
It buys you some extra safety, too.
You could also use a free function:
template<class X> shared_ptr<X> clone(X const & x) {
shared_ptr<X> px = dynamic_pointer_cast<X>(x.do_clone()); assert(px); return px; }
So, to clone an object using the clone method, I could use: X* x; shared_ptr<X> spX(x = new X()); shared_ptr<X> spX2 = spX->clone(); // or: shared_ptr<X> spX3 = x->clone(); But how is the free function meant to be used? This provokes the compiler error: '... do_clone() const is private ...': shared_ptr<X> spX4 = clone(*spX); Thank you Bernhard