
On Tue, Dec 23, 2008 at 4:54 AM, Jason Cipriani <jason.cipriani@gmail.com> wrote:
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;
}
Scratch that, this seems safer: template <typename Dest, typename Src> shared_ptr<Dest> shared_reinterpret_cast (const shared_ptr<Src> &src) { shared_ptr<Src> hack(src); return *(shared_ptr<Dest> *)&hack; } The first attempt would cause problems if shared_ptr's implementation stored a pointer to itself, for some reason, or gave it's address to some other shared_ptr. Jason
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@gmail.com> 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