Boost logo

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