
on Thu Jan 08 2009, "Daniel James" <daniel_james-AT-fmail.co.uk> wrote:
2009/1/8 Howard Hinnant <hinnant@twcny.rr.com>:
Is it practical to do this instead?
class vector { void push_back(value_type x); // internally move construct from x }
I was doing this (which is inspired by either Adobe or David Abrahams):
template <class U> void push_back(U const& x, typename boost::copy_sink<U, T>::type = 0) { if(data_.end_ == data_.storage_end_) resize(data_.begin_ ? size() * 2 : 4); std::uninitialized_fill_n(data_.end_, 1, x); ++data_.end_; }
#if !defined(BOOST_NO_SFINAE)
template <class U> void push_back(U x, typename boost::move_sink<U, T>::type = 0) { if(data_.end_ == data_.storage_end_) resize(data_.begin_ ? size() * 2 : 4); data_.end_ = boost::uninitialized_move(&x, &x + 1, data_.end_); }
#endif
Those xxx_sink things are Adobe's. I never liked them, but they solve problems to which I've never found a better answer. I believe they are the current state of the art. -- Dave Abrahams BoostPro Computing http://www.boostpro.com