曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4111|回复: 0
打印 上一主题 下一主题

[Type Traits] __is_empty

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2014-1-12 22:56:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-30 10:34 , Processed in 0.089593 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表