关于<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
将被指定为