Boost logo

Boost :

Subject: Re: [boost] [Review] Boost.Type Traits Extension by Frederic Bron
From: Frédéric Bron (frederic.bron_at_[hidden])
Date: 2011-03-16 10:14:26


> The following two types are not used anywhere
>   typedef typename ::boost::remove_cv::type rhs_nocv;
>   typedef typename ::boost::remove_cv< typename ::boost::remove_reference<
> typename ::boost::remove_pointer::type >::type >::type rhs_noptr;
>
> Shouldn't them be removed?

They are used, but not in the example of the doc.
These shortcuts are used extensively in the macro FOBIDDEN_IF which
determines if the operator is forbidden for fundamental types (to
avoid compile time error).
In the doc, I chose a simple case (unary_minus) where FORBIDDEN_IF is
only ::boost::is_pointer< rhs_noref >::value

Here is a more complex example (has_operator_plus.hpp):
#define BOOST_TT_FORBIDDEN_IF\
   ::boost::type_traits::ice_or<\
      /* pointer with pointer */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< lhs_noref >::value,\
         ::boost::is_pointer< rhs_noref >::value\
>::value,\
      /* pointer with fundamental non integral */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< lhs_noref >::value,\
         ::boost::is_fundamental< rhs_nocv >::value,\
         ::boost::type_traits::ice_not< ::boost::is_integral<
rhs_noref >::value >::value\
>::value,\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< rhs_noref >::value,\
         ::boost::is_fundamental< lhs_nocv >::value,\
         ::boost::type_traits::ice_not< ::boost::is_integral<
lhs_noref >::value >::value\
>::value,\
      /* void* with fundamental */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< lhs_noref >::value,\
         ::boost::is_void< lhs_noptr >::value,\
         ::boost::is_fundamental< rhs_nocv >::value\
>::value,\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< rhs_noref >::value,\
         ::boost::is_void< rhs_noptr >::value,\
         ::boost::is_fundamental< lhs_nocv >::value\
>::value\
>::value

> I have not see the utility of removing the reference
>   typedef typename ::boost::remove_reference::type rhs_noref;

It is just used to know if the operation is forbidden for fundamental
types and pointers. It avoids having everywhere typename
::boost::remove_reference< ... >::type.
When checking for existence of operator, full type qualification is
used (i.e. LHS or RHS).

Frédéric


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk