曲径通幽论坛

标题: __is_empty [打印本页]

作者: easy    时间: 2014-1-12 22:56
标题: __is_empty
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 。






欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2