• 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;

  • 相关阅读:
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 26. 树的子结构
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 29. 顺时针打印矩阵
    剑指 Offer 30. 包含min函数的栈
    剑指 Offer 22. 链表中倒数第k个节点
    选轻量应用服务器还是云服务器ECS?一图彻底搞懂
    征文投稿丨使用云服务器ECS快速搭建halo博客
    运营给产品送的情人节礼物是?
    阿里云张献涛:自主最强DPU神龙的秘诀
  • 原文地址:https://www.cnblogs.com/wenlove/p/3087803.html
Copyright © 2020-2023  润新知