zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    Part 29 AngularJS intellisense in visual studio
    Part 28 AngularJS default route
    css动画效果之一
    css
    css.盒子阴影
    css字行标签谁写写
    简单的介绍a标签点击个成
    看css.1的启示。
    css.1
    总结:html
  • 原文地址:https://www.cnblogs.com/wenlove/p/3087803.html
Copyright © 2011-2022 走看看