如何在编译期进行类型的非const限定--源于stl源码

1、使用模板定义一个  struct integral_constant

template

    _Ty _Val>
    struct integral_constant
    {    // convenient template for integral constant types
    static constexpr _Ty value = _Val;

    using value_type = _Ty;
    using type = integral_constant;

    constexpr operator value_type() const _NOEXCEPT
        {    // return stored value
        return (value);
        }

    constexpr value_type operator()() const _NOEXCEPT
        {    // return stored value
        return (value);
        }
    };

2、定义bool类型--true_type、false_type

 // ALIAS TEMPLATE bool_constant
template
    using bool_constant = integral_constant;

using true_type = bool_constant;
using false_type = bool_constant;

3、定义is_const模板类型--利用const特性

template
    struct is_const
        : false_type
    {    // determine whether _Ty is const qualified
    };

template
    struct is_const
        : true_type
    {    // determine whether _Ty is const qualified
    };

template
    _INLINE_VAR constexpr bool is_const_v = is_const<_Ty>::value;

4、使用介绍

static_assert(!is_const_v<_Ty>,"err tips");

static_assert(!is_const_v,"err tips");    // ok

static_assert(!is_const_v,"err tips");    //err

5、stl中使用例子如下:

template
    class allocator
    {    // generic allocator for objects of class _Ty
public:
    static_assert(!is_const_v<_Ty>,
        "The C++ Standard forbids containers of const elements "
        "because allocator is ill-formed.");

    ...

    }

 

 

你可能感兴趣的:(如何在编译期进行类型的非const限定--源于stl源码)