|
Boost : |
From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2006-08-04 14:03:13
gast128 wrote:
> Dear all,
>
> it seems that the pointer container library does not interfere well with
> back_inserter, i.e.
>
> boost::ptr_vector<int> v2;
> std::back_insert_iterator< boost::ptr_vector<int> > b(v2);
> b.operator=(new int); //forget it
[remark: I assume you only use int as example?]
> This is unfortunate, because now a lot of STL (or our own adapters) containers
> can't be used (e.g. std::transform, std::generate_n)
This is because the concept of a PtrContainer is not the same as a
Container. Specifically, back_inserter() will try to call push_back()
which does not take a T& parameter, but a T* parameter. operator=() in
back_insert_iterator will on the other take a T& parameter.
After the review, the T& overloads for push_back() etc were removed
because people felt they weren't needed.
I see two ways to solve the problem:
1. overload push_back(), push_front(), insert() etc for T& parameters
2. provide a new function:
template< class PtrCont >
ptr_back_insert_iterator<PtrCont> ptr_back_inserter( PtrCont& c )
{ return ptr_back_insert_iterator<PtrCont>(c); }
template< class PtrCont >
class ptr_back_insert_iterator<PtrCont>
{
...
ptr_back_insert_iterator& operator=( typename PtrCont::reference r )
{ c_.push_back( new_clone(r) ); return *this; }
};
Have I overlooked something?
I think I would favor option 1. However, this should be discussed in the
developer list first.
I'm also planning to drop the forced non-copyability (by providing cc
and ca) since we have discussed in a couple of times and both times I
seemed to be the only one who favors the current design.
-Thorsten
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk