Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-12-10 08:00:12


From: "Johan Nilsson" <johan.nilsson_at_[hidden]>
>
> "Peter Dimov" <pdimov_at_[hidden]> wrote in message
> news:00bb01c2a046$671b1c20$1d00a8c0_at_pdimov2...
> > From: "Johan Nilsson" <johan.nilsson_at_[hidden]>
> > [...]
> > > template<typename T>
> > > T* dynamic_void_cast(void* pv)
> > > {
> > > struct rtti_obj__
> > > {
> > > virtual ~rtti_obj__() = 0;
> > > };
> > >
> > > rtti_obj__* pro = static_cast<rtti_obj__*>(pv);
> > >
> > > try
> > > {
> > > return dynamic_cast<T*>(pro);
> > > }
> >
> > This is not required to work. T's vtable pointer is not guaranteed to be
> at
> > offset 0.

Actually I meant *pv's vtable pointer here.

> But I thought that it _might_ be required to be at the same offset for T
as
> for rtti_obj. For that part, IIRC, a vtable isn't required at all, or?

Try it (on several compilers, as some do put the vptr at offset 0.)

struct X { int n; };
struct Y: public X { virtual ~Y() {} };

Y+0: X::n
Y+4: vptr

rtti_obj__+0: vptr


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk