boost之is_array ,integral_c

BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,false)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T[N],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const[N],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T volatile[N],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const volatile[N],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T[],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const[],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T volatile[],true)
BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],true)
--------------------------------------------------------
//BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,false)
//1.
template< typename T > struct is_array
: public ::boost::integral_constant<bool, false>
{
public:
};

//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T[N],true)
//2.
template< typename T, std::size_t N > struct is_array< T[N] >
: public ::boost::integral_constant<bool, true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const[N],true)
//3.
template< typename T, std::size_t N > struct is_array< T const[N] >
: public ::boost::integral_constant<bool, true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T volatile[N],true)
//4.
template< typename T, std::size_t N > struct is_array< T volatile[N] >
: public ::boost::integral_constant<bool, true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const volatile[N],true
//5.
template< typename T, std::size_t N > struct is_array< T const volatile[N]>
: public ::boost::integral_constant<bool, true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T[],true)
//6.
template< typename T > struct is_array< T[] >
: public ::boost::integral_constant<bool,true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const[],true)
//7
template< typename T > struct is_array< const[] >
: public ::boost::integral_constant<bool,true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T volatile[],true)
//8
template< typename T > struct is_array< T volatile[] >
: public ::boost::integral_constant<bool,true>
{
public:
};
//BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],true)
//9.
template< typename T > struct is_array< ,T const volatile[] >
: public ::boost::integral_constant<bool,true>
{
public:
};
-------------------------------------------------------------------
# define AUX_WRAPPER_PARAMS(N) typename T, T N
#define AUX_WRAPPER_NAME integral_c
#define AUX_WRAPPER_VALUE_TYPE T
#define AUX_WRAPPER_INST(value) AUX_WRAPPER_NAME< T, value >

template< bool C >
struct integral_c<bool, C>
{
BOOST_STATIC_CONSTANT(bool, value = C);
typedef integral_c_tag tag;
typedef integral_c type;
typedef bool value_type;
operator bool() const { return this->value; }
};

integral_c定义在文件mpl\aux_ integral_wrapper.hpp
template< AUX_WRAPPER_PARAMS(N) >
struct AUX_WRAPPER_NAME
{
BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, value = N);
typedef AUX_WRAPPER_NAME type;
typedef AUX_WRAPPER_VALUE_TYPE value_type;
typedef integral_c_tag tag;

typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value + 1)) ) next;
typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value - 1)) ) prior;

operator AUX_WRAPPER_VALUE_TYPE() const { return static_cast<AUX_WRAPPER_VALUE_TYPE>(this->value); }
};
template< AUX_WRAPPER_PARAMS(N) >
AUX_WRAPPER_VALUE_TYPE const AUX_WRAPPER_INST(N)::value;
宏展开为:
template< typename T, T N >
struct integral_c
{
BOOST_STATIC_CONSTANT(T, value = N);
typedef integral_c type;
typedef T value_type;
typedef integral_c_tag tag;

typedef integral_c< T, BOOST_MPL_AUX_STATIC_CAST(T, (value + 1)> next;
typedef integral_c< T, BOOST_MPL_AUX_STATIC_CAST(T, (value - 1))> prior;

operator T() const { return static_cast<T>(this->value); }
};
template< typename T, T N >
T const integral_c< T, N>::value;

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