boost之is_reference

BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,::boost::detail::is_reference_impl<T>::value)

template< typename T > struct is_reference
BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_reference_impl<T>::value)
{
public:
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_reference_impl<T>::value)
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference,(T))
};
BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,is_reference)
----------------------------------------------------------------------------
BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,is_reference)忽略,BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference,(T))
忽略,BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_reference_impl<T>::value) 忽略,宏展开为
template< typename T > struct is_reference
: public ::boost::integral_constant<bool,::boost::detail::is_reference_impl<T>::value>
{
public:
};

struct is_reference_impl
{
BOOST_STATIC_CONSTANT(bool, value =
(::boost::type_traits::ice_or<
::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value
>::value));
};
::boost::is_lvalue_reference实现是两个宏定义
BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,false)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T&,true)
-----------------------------------------------------------------
BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,false)宏展开为
template< typename T > struct is_lvalue_reference
: public ::boost::integral_constant<bool, false>
{
public:
};
-----------------------------------------------------------------
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T&,true)展开为
template< typename T > struct is_lvalue_reference< T& >
: public ::boost::integral_constant<bool, true>
{
public:
};
也就是is_lvalue_reference当T为引用时的特化版本
::boost::is_rvalue_reference实现由以下两个宏
-----------------------------------------------------------------
先是is_rvalue_reference的范型版本BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_rvalue_reference,T,false)
template< typename T > struct is_rvalue_reference
: public ::boost::integral_constant<bool, false>
{
public:
};
-----------------------------------------------------------------
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_rvalue_reference,T&&,true)
template< typename T > struct is_rvalue_reference< T&& >
: public ::boost::integral_constant<bool, true>
{
public:
};
-----------------------------------------------------------------
template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
struct ice_or;

template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
struct ice_or
{
BOOST_STATIC_CONSTANT(bool, value = true);
};

template <>
struct ice_or<false, false, false, false, false, false, false>
{
BOOST_STATIC_CONSTANT(bool, value = false);
};

ice_or只要有一个value为ture,则其value就为true,总结一下当is_reference<T>::value=true,当且仅当
::boost::is_lvalue_reference<T>::value=true或::boost::is_rvalue_reference<T>::value=true,
也就是当T为T&或T&&的某种形式时is_reference<T>::value=true

原文地址:https://www.cnblogs.com/wenlove/p/3087145.html