三、类型获取

1 decay_t

进行类型退化

  • 这是decay_t的声明,decay_tdecay<_Tp>::type的别名
  template<typename _Tp>                     
    using decay_t = typename decay<_Tp>::type;
  • 这里是decay类的定义。
    首先,除去_Tp类型的引用限定符。
    之后,对去掉引用限定符的__remove_type进行处理
  template<typename _Tp>                
    class decay
    {
      typedef typename remove_reference<_Tp>::type __remove_type;

    public:
      typedef typename __decay_selector<__remove_type>::__type type;
    };
  • 这里是对__remove_type的处理

__decay_selector定义了三个特例化版本,分别对应于对普通类型、数组类型和函数:

  1. 普通类型:去掉cv限定符
  2. 数组类型:退化为指针类型
  3. 函数类型:退化为函数指针类型
  template<typename _Up,                                          
	   bool _IsArray = is_array<_Up>::value, 
	   bool _IsFunction = is_function<_Up>::value> 
    struct __decay_selector; 

  // NB: DR 705. 
  template<typename _Up> 
    struct __decay_selector<_Up, false, false> 
    { typedef __remove_cv_t<_Up> __type; }; 

  template<typename _Up> 
    struct __decay_selector<_Up, true, false> 
    { typedef typename remove_extent<_Up>::type* __type; }; 

  template<typename _Up> 
    struct __decay_selector<_Up, false, true> 
    { typedef typename add_pointer<_Up>::type __type; }; 

2 add修饰符

1 add_const

添加顶层const

  template<typename _Tp>    
    using add_const_t = typename add_const<_Tp>::type;

  template<typename _Tp>  
    struct add_const
    { typedef _Tp const     type; };

2 add_volatile

添加v限定符

  template<typename _Tp>
    struct add_volatile
    { typedef _Tp volatile     type; };

3 add_cv

添加cv限定符

使用了到 add_constadd_volaile分别添加c和v限定符

  template<typename _Tp>
    struct add_cv
    {
      typedef typename
      add_const<typename add_volatile<_Tp>::type>::type     type;
    };

3 remove修饰符

1 remove_const

去除顶层const

  template<typename _Tp>      
    using remove_const_t = typename remove_const<_Tp>::type;

  template<typename _Tp>
    struct remove_const
    { typedef _Tp     type; };

  template<typename _Tp>
    struct remove_const<_Tp const>
    { typedef _Tp     type; };

2 remove_volatile

去除v限定符

  template<typename _Tp>
    struct remove_volatile
    { typedef _Tp     type; };

  template<typename _Tp>
    struct remove_volatile<_Tp volatile>
    { typedef _Tp     type; };

3 remove_cv

去除cv限定符

四个特例化版本分别对应四种情况:

  1. 没有cv限定符
  2. 有c限定符
  3. 有v限定符
  4. 有cv限定符
  template<typename _Tp>     
    struct remove_cv;

  template<typename _Tp>  
    struct remove_cv
    { using type = _Tp; };

  template<typename _Tp>
    struct remove_cv<const _Tp>
    { using type = _Tp; };

  template<typename _Tp>
    struct remove_cv<volatile _Tp>
    { using type = _Tp; };

  template<typename _Tp>
    struct remove_cv<const volatile _Tp>
    { using type = _Tp; };

4 type_identity

在某些情况下,希望返回原始类型。

比如:在模板推断出现问题时,我们希望返回原始类型。

  template<typename _Tp>
    struct type_identity { using type = _Tp; };

  template<typename _Tp>
    using type_identity_t = typename type_identity<_Tp>::type;

5 underlying_type

获取枚举类型的底层基础类型

  template<typename _Tp>
    using underlying_type_t = typename underlying_type<_Tp>::type;

例如

enum class En : unsigned long { En1, En2, En3 };
int main() {
  std::cout << __cplusplus << std::endl;
  using type = std::underlying_type_t<En>;
  auto val1 = static_cast<type>(En::En1);
  auto val2 = static_cast<type>(En::En2);
  auto val3 = static_cast<type>(En::En3);
}

6 invoke_result_t

推导出返回值类型

C++11的 result_of废除了

  template<typename _Fn, typename... _Args>       
    using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值