$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] Adding polymorphic_value to boost
From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2017-11-22 23:31:21
Peter Dimov wrote:
> You can have
>
> vector<polymorphic_value<Shape>> v;
>
> and then
>
> v.push_back( Circle(10) );
> v.push_back( Ellipse(10, 15) );
> v.push_back( Square(11) );
Good example. Yes please.
There's another way of implementing this, though; rather than
pointing to the object in the heap you can store it in-place
by allocating enough space for the largest possible derived
subclass:
class Base { ... };
class Derived: public Base { ... };
template <typename B>
class polymorhpic_value_2
{
B base;
char enough_space_for_dervided_classes_members[1024];
public:
template <typename D> // requires D is same as or derived from B
void operator=(const D& d)
{
B::~B(this);
new (this) D(d);
}
};
polymorphic_value_2<Base> p;
Derived d;
p = d;
That's just a sketch; many details omitted! There are some obvious
advantages and disadvantages of each approach and I'm definitely not
saying this is better than the pointer-to-heap design. But I mention it
for this reason:
* If your proposed interface for polymorphic_value could also work
for this method of implementation, then it is probably a better
interface.
> It's unfortunate we have to use -> instead of . but that's what's available.
There have been proposals for operator. ; has this been evaluated to
see how it would work with them? Similarly the unified a.b() vs. b(a)
syntax proposal.
Regards, Phil.