|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2002-12-10 09:41:57
"Johan Nilsson" <johan.nilsson_at_[hidden]> writes:
> "David Abrahams" <dave_at_[hidden]> wrote in message
>
>> A rather lengthy example with no comments or explanatory text
>> describing what it's supposed to be accomplishing is not very easy to
>> analyze. If you want feedback from the group, it would be polite to
>> describe what you're trying to do.
>>
>
> I certainly wasn't being intentionally rude; apologies to anyone
> offended by my posting.
Your posting wasn't exactly rude; it just asked for a lot more than it
probably should from your readers.
> I just wanted to get some feedback on what I tried, and currently consider
> the stuff as a hack. But, as the functionality would be extremely helpful
> for object factories, I thought I might as well post the code and get some
> comments about it. 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.
The quibble I have with all this, which you _still_ haven't satisfied,
is that you never said in simple terms what you're trying to
accomplish. A sentence as simple as, "I'm trying to dynamic cast from
an arbitrary void* to and arbitrary polymorphic object type" would
have sufficed. I came to this explanation after looking at your code
below again, and I'm still not sure that's what you're trying to do.
Incidentally, shared_ptr<void> may allow you the kind of type erasure
you want. Just a thought...
>
> 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());
> }
> }
>
> ----------
>
> I'll put together a sample showing some more concrete usage, this is more
> something of an apologetic sample ;-)
>
> // Johan
>
>
>
>
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>
-- David Abrahams dave_at_[hidden] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk