"Terje Slettebų" <[EMAIL PROTECTED]> wrote in message
00e001c2a04e$92f9c190$60fb5dd5@pc">news:00e001c2a04e$92f9c190$60fb5dd5@pc...
> >From: "Johan Nilsson" <[EMAIL PROTECTED]>
>
>
> > The hack makes no 'fixed' assumptions on binary object
> > layout, rather, it relies on the fact that any polymorphic type can be
> > queried for an implemented interface (aka 'base class'). It does,
however,
> > make the assumption that the location of the rtti itself data is fixed
for
> a
> > specific c++ implementation across different polymorphic types.
> >
> > Sample usage (demonstrating syntax only):
> > --------------
> >
> > void foo(void*)
> > {
> >     try
> >     {
> >         IMyBaseClass* pmc = dynamic_void_cast<IMyClass>(pv);
> >
> >         if (pmc)
> >        {
> >             pmc-MyFn();
> >         }
> >     }
> >     catch (std::exception&)
> >     {}
> > }
> >
> >
> > The hack:
> > ------
> > 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);
> >   }
> >   catch (bad_cast&)
> >   {
> >     throw;
> >   }
> >   catch (exception& e)
> >   {
> >     throw bad_cast(e.what());
> >   }
> > }
> >
> > ----------
>
> Why do you catch, and just rethrow exceptions? Why not just let them
> propagate (no try/catch), or turning them into return zero? Also, what
other
> exception, besides bad_cast, can dynamic_cast throw, which necessitates
the
> second catch clause?

This is rather platform specific, but in VC.NET, you can get the exception
__non_rtti_object (which is derived from bad_typeid)thrown as well. I
preferred throwing bad_cast exceptions only.

// Johan





_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to