Boost logo

Boost :

Subject: Re: [boost] [optional] little addition... optional_move_to?
From: Niels Dekker - mail address until 2010-10-10 (niels_address_until_2010-10-10_at_[hidden])
Date: 2009-03-04 09:28:14

Fernando Cacciola wrote:
> That is, we can't just yet write that as:
> template<class T, class U> bool optional_assign( T&, optional<U>&& ) ;
> as we would a few years from now.

Well, we can achieve almost the same in old C++03, by declaring the
function as a /member/ of optional<T>. I'd suggest naming it
"optional_move_to", as follows:

 template <class U>
 bool optional_move_to(U& arg)
   if (*this)
     // Moves from **this to arg.
     optional_detail::move_assign(arg, **this);
     return true;
     return false;

optional_detail::move_assign could be implemented by doing either
boost::swap (when T == U) or copy-assignment (when T != U), e.g., by

  template <class T>
  void move_assign(T& lhs, T& rhs)
    boost::swap(lhs, rhs);

  template <class T, class U>
  void move_assign(T& lhs, U& rhs)
    lhs = rhs;

What do you think?

Arno, given such a optional<T>::optional_move_to member function, would
you still prefer to use your own optional_assign function? Otherwise
your use case could be written as follows:

  boost::optional< TMyValue > TryToGetT();
  T t;

  if( ! TryToGetT().optional_move_to(t) ) {
    ... other way to get t ...

Kind regards, Niels

Boost list run by bdawes at, gregod at, cpdaniel at, john at