Boost logo

Boost Users :

From: Vaclav Vesely (vaclav.vesely_at_[hidden])
Date: 2003-02-16 17:32:30


Peter,

thank you for your suggesstion. It's smart.

Wasek

> -----Original Message-----
> From: Peter Dimov [mailto:pdimov_at_[hidden]]
> Sent: Friday, February 14, 2003 12:11 PM
> To: Boost-Users_at_[hidden]
> Subject: Re: [Boost-Users] covariance of shared_ptr types
>
>
> 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;
> }
>
>
> ------------------------ Yahoo! Groups Sponsor
> ---------------------~--> Get 128 Bit SSL Encryption!
> http://us.click.yahoo.com/FpY02D/vN2EAA/xGHJAA/EbFolB/TM
>
> --------------------------------------------------------------
> -------~->
>
> Info: <http://www.boost.org>
> Wiki: <http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl>
> Unsubscribe: <mailto:boost-users-unsubscribe_at_[hidden]>
>
>
> Your use of Yahoo! Groups is subject to
> http://docs.yahoo.com/info/terms/
>
>


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