Type Traits 中文意为“类型特征”,是 C++ 的扩展组件。如果编译器支持该扩展,那么编译器在编译时,可以指示一个类型的不同特征(比如是否为空类,是否为一个char 类型等等)。
实际上,类型特征是一种模板类型。下面以 __is_empty( type ) 这个模板为例,该组件测试 type 这个类型是不是一个空类(empty class)。
那么什么是空类?一个空类(用 struct 或 class 都可以声明出一个类)里不存储数据,如:
1. 类中不包含非静态成员。
2. 类中不包含虚拟函数以及虚基类。
测试示例:
[C++] 纯文本查看 复制代码 // is_empty.cpp
#include <stdio.h>
struct S {
int Test() {}
static int i;
};
int main() {
__is_empty(S) == true ?
printf("true\n") : printf("false\n");
}
上面输出结果为 true 。
参考:http://msdn.microsoft.com/zh-cn/library/ms177194(v=vs.120).aspx
在 MS 网站上并没有找到 __is_empty 的源码,但在 GNU 上却找到了相应的源码:
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/structstd_1_1____is__empty.html
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/cpp__type__traits_8h-source.html
比如看 GNU 这段实现代码:
template<typename _Tp>
00359 struct __is_empty
00360 {
00361 private:
00362 template<typename>
00363 struct __first { };
00364 template<typename _Up>
00365 struct __second
00366 : public _Up { };
00367
00368 public:
00369 enum
00370 {
00371 __value = sizeof(__first<_Tp>) == sizeof(__second<_Tp>)
00372 };
00373 };
__is_empty 实际就是个模板类。在它里面定义了两个成员模板,一个是 __first {} ,这是个空类;另一个是 __second,它公有继承了模板类型 _Up (由用户传入,也就是用户要测试的类型)。在底下,用了两个 sizeof 分别测量了 __first 和 __second 的大小。当然,第一个 __first 的大小为 0,第二个若不是空类,必大于 0,表达式结果为 false;反过来,表达式结果为 ture 。
|