Boost logo

Boost :

From: Howard Hinnant (hinnant_at_[hidden])
Date: 2004-01-23 18:39:40

On Jan 23, 2004, at 6:02 PM, Jonathan Turkanis wrote:

> If we want to implement Rani's suggestion, all I can think of is
> something like:
> template<typename U>
> move_ptr( const move_ptr< U[] >& ptr, typename enable_if<
> is_more_cv< T, U> >::type* = 0);
> Where is_more_cv is defined to mean is_same<remove_cv<T>::type,
> remove_cv<U>::type> and U is no more cv-qualified than T.
> This is pretty messy. Is there any easier way?

I think Rani's suggestion is the best way to go. Maybe something like

template <class T, class U>
struct is_array_convertible
        typedef typename remove_bounds<T>::type t_element;
        typedef typename remove_bounds<U>::type u_element;
        typedef typename remove_cv< t_element >::type t_basic;
        typedef typename remove_cv< u_element >::type u_basic;
     static const bool value =
         is_array<T>::value &&
         is_array<U>::value &&
         is_same<t_basic, u_basic>::value &&
         is_convertible<t_element*, u_element*>::value;


template<typename U>
     const move_ptr< U >& ptr,
     typename enable_if
         is_array_convertible<U, T[]>::value
>::type* = 0);

You might see messy. I see: Wow, that's really cool! ;-)

Also, nice job on picking up this cv issue for arrays. I hadn't
thought about it.

As long as we're on the subject, make sure you restrict move_ptr<U[]>
conversions to move_ptr<T>, even if is_convertible<U*, T*>:

move_ptr<int> p(move_ptr<int[]>()); // should not compile


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