《C++ Primer Plus 6th.ed》读书笔记之四:简单的type_traits实现及其应用

本文介绍了C++2011标准后加入的头文件<type_traits>,通过分析type_traits的实现,探讨了如何确定类型的属性。文章以C++内建类型为例,讨论了模板展开过程,并提及了C++14和C++17对此头文件的改进,包括模板的可函数对象化和添加获取类型判断结果的模板变量。
摘要由CSDN通过智能技术生成
关于<type_traits>

<type_traits>是C++自2011年标准后添加到STL中的一个头文件,正如其名,它提供了一系列模板类去确定类型的属性,例如:

// 检查传入类型参数是否为void
template<typename _Tp>
struct is_void : public __is_void_helper<typename remove_cv<_Tp>::type>::type
{
    };

// 可以这样使用它
#include <type_traits>
bool _v_flag = std::is_void<int>::value;  	// false
bool _i_flag = std::is_void<void>::value;	// true

更多具体示例见这里,本文以is_void<>为例,简单剖析一下<type_traits>对c++内建类型的实现方法
那么为什么不讲一下对自定义类型的实现呢?因为C++在编译时无法产生太多的元信息,因此无法进行模板替换与展开,这部分代码实现是直接写在编译器源码中的,而我又比较懒,不想去翻gcc的源码……

is_void<>模板展开

首先,is_void<>是一个模板类,只不过这个模板类是由struct定义的——除了成员访问权限默认为public,与class并无二致——它的源码在文章开头已经贴过了,这里再贴一遍:

template<typename _Tp>
struct is_void : public __is_void_helper<typename remove_cv<_Tp>::type>::type
{
    };

可以看到,它以公开继承的方式继承了另外一个模板类__is_void_helper,看来这个类模板是我们下一步要找的目标,不过先看一下这个继承中的其他部分再去考虑这个基类的实现
其中remove_cv也是声明在该文件中一个类模板,但是在该文件中仅有声明而无实现,估计也是由编译器实现的吧,它的作用是抹去传入类型的const/volatile属性,例如传入类型参数为const void,那么其类型成员type将被指定为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值