Boost logo

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