
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; } else { 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 overloading: 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