>From: "Peter Dimov" <[EMAIL PROTECTED]> > From: "Johan Nilsson" <[EMAIL PROTECTED]> > > > > "Peter Dimov" <[EMAIL PROTECTED]> wrote in message > > 00bb01c2a046$671b1c20$1d00a8c0@pdimov2">news:00bb01c2a046$671b1c20$1d00a8c0@pdimov2... > > > From: "Johan Nilsson" <[EMAIL PROTECTED]> > > > [...] > > > > 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
I've tested it. Test code: --- Start --- struct X { int n; }; struct Y: public X { public: virtual ~Y() {} }; int main() { Y y; Y *yptr=dynamic_void_cast<Y>(&y); } --- End --- Here are the results: MSVC 6 - vptr at 0 - It works Intel C++ 7.0 - vptr at 0 - It works g++ 2.95.3 - vptr _not_ at zero - boom! :) It gives an OS protection error at the point of dynamic_cast BCB 6 - vptr _not_ at zero - boom! :) It gives an OS protection error at the point of dynamic_cast Conclusion: Not recommended. :) Besides, I can't see the point in testing for bad_cast there, since it uses T * (not T) in the dynamic_cast, which I think would never throw bad_cast. This also means that its signature is different from dynamic_cast, and that it therefore can't be used for casting references (unlike dynamic_cast). In any case, this means it is inherently implementation-dependent and unsafe. Regards, Terje _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost