Boost logo

Boost :

From: Fernando Cacciola (fernando_cacciola_at_[hidden])
Date: 2006-10-10 10:15:23


Vaclav Vesely wrote:
> Fernando Cacciola wrote:
>
>>Vaclav Vesely wrote:
>>
>>>I would like to do somethink like this:
>>>
>>> class Base {...}
>>> class Derived: public Base {...}
>>>
>>> optional<Base> x = Derived();
>>> y->call_virtual_functions()
>>
>>It looks a lot like Boost.Any.
>>Have you looked at it?
>
>
> boost::any doesn't support derived classes as well. For example:
>
> any x = Derived();
> any_cast<Base>(x).virtual_function(); // throws bad_any_cast
>
> And moreover boost::any is too general. I want to store only values of Base
> and its derived classes.
>
OK.
Still, Boost.Any is a lot closer to that than Boost.Optional
The fundamental issue is that Boost.Optional stores copies of the values
in its own storage. That's a key feature of optional<>.
In your design, as in Boost.Any's, the values are stored in a separate
storage and the wrapper is merely a proxy to it. So this is more the job
of a form of smart pointer (that manages external resources).

IIRC, a few years ago Peter Dimov sketched a polymorphic variant class
in line with your idea (unless I got it all wrong).
I can't recall where I saw it though. Peter?

In any event, I think what you need is a new beast rather an extension
to optional<> because of the separate storage needed to hold the
polymorphic value.

Best

Fernando Cacciola
SciSoft
Buenos Aires, Argentina


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