|
Boost Users : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-02-14 06:10:51
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;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net