Boost logo

Boost Users :

Subject: Re: [Boost-users] shared_ptr downcast
From: Jason Cipriani (jason.cipriani_at_[hidden])
Date: 2008-12-23 04:54:55


Research is showing this isn't possible. I'm sure there's a good
reason for it... but I need to get this working. I came up with this
hack that works but is scary. Assuming there is no virtual inheritance
involve (this would have the same semantics as reinterpret_cast):

template <typename Dest, typename Src>
shared_ptr<Dest> shared_reinterpret_cast (const shared_ptr<Src> &src) {

        shared_ptr<Src> hack(src);
        shared_ptr<Dest> dest;

        assert(sizeof(hack) == sizeof(dest));
        char buf[sizeof(dest)];

        // swap dest and hack
        memcpy(buf, &dest, sizeof(dest));
        memcpy(&dest, &hack, sizeof(dest));
        memcpy(&hack, buf, sizeof(hack));
        
        return dest;

}

It's really dirty, but will it work OK? The basic idea is to swap a
new shared_ptr<Base> with an empty shared_ptr<Derived>, but bypass
shared_ptr::swap()'s type checking.

Jason

On Tue, Dec 23, 2008 at 4:36 AM, Jason Cipriani
<jason.cipriani_at_[hidden]> wrote:
> If I have:
>
> class Base { };
> class Derived : public Base { };
>
> And a container, e.g.:
>
> std::vector<boost::shared_ptr<Base> > objs;
>
> How do I downcast to a shared_ptr<Derived>? E.g.:
>
> boost::shared_ptr<Derived> d = (boost::shared_ptr<Derived>)objs[0];
>
> I have a function that takes a shared_ptr<Derived> and all I have is a
> shared_ptr<Base>. I don't mind static_cast behavior, although
> dynamic_cast behavior would be ideal.
>
> Thanks,
> Jason
>


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