Vaclav Vesely wrote:
However it is NOT possible to write that with shared_ptr:
class X { shared_ptr<A> f() { ... }; };
class Y: public X { virtual shared_ptr<B> f() { ... }; // Error: shared_ptr<B> is NOT covariant from shared_ptr<A> };
I don't know C++ standard very well (in fact I've never read it). So my question is: it's possible to adjust shared_ptr to allow such constructions?
No, but 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; }