$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: MB (mb2act_at_[hidden])
Date: 2006-01-06 19:52:32
Thorsten Ottosen wrote:
> MB wrote:
> 
>>Hi,
>>
>>I think non-intrusive customization way needs four specializations;
>>'X', 'const X', 'volatile X' and 'const volatile X'.
>>At last, twenty specializations are required for five metafunctions.
>>I view that's something like the pitfall of public virtual interfaces.
> 
> 
> if that is true, then it is certainly bad.
> 
> 
>>Only range_result_iterator happens to work around by using remove_cv.
>>
>>See:
>>
>>  I added followings to <libs/range/doc/example.cpp>:
>>
>>    template< class Range >
>>    typename boost::range_result_iterator<Range>::type
>>    my_begin(Range& rng)
>>    {
>>      return boost::begin(rng);
>>    }
>>
>>      // then...
>>      my_begin(cpair); // error
> 
> 
> right, because we instantiate range_const_iterator< const T >, which 
> should never happen.
> 
> 
>>  Why not something like:
>>
>>    template< class T >
>>    struct range_result_iterator :
>>      mpl::eval_if< is_const<T>,
>>        range_const_iterator< typename remove_cv<T>::type >,
>>        range_iterator< typename remove_cv<T>::type >
>>      >
>>    { };
> 
> 
> Seems right to me.
> 
> I the latest release I actually added similar stuff to begin(),end() to 
> remove const qualifiers from "const T", since it lead to such "const T" 
> being used to instatiate metafunctions *even though* the overload was 
> never picked.
> 
> So this means that begin()/end() must also remove volatile. Cute :-)
> 
> Thanks for the feedback
> 
> -Thorsten
I show my current private patch:
   namespace boost {
       namespace range_detail {
           template< class T >
           struct remove_cv_ :
           #if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)
               remove_cv<T>
           #else
               mpl::eval_if< is_array<T>, // is_const is broken if array
                   remove_volatile<T>,
                   remove_cv<T>
               >
           #endif
           { };
       } // namespace range_detail
       //////////////////////////////////////////////////////////////////////////
       // default
       //////////////////////////////////////////////////////////////////////////
       template< class T >
       struct range_result_iterator :
           mpl::eval_if< is_const<T>,
               range_const_iterator< typename range_detail::remove_cv_<T>::type >,
               range_iterator< typename range_detail::remove_cv_<T>::type >
           >
       { };
   } // namespace boost
But I guess this is not portable for broken compilers, though
eVC4, VC7.1, VC8 and GCC3.4 seem to work.
All I can say is "Be careful about 'boost::is_const'." :-)
Regards,
MB
p-stade.sourceforge.net