技术: C++11 类型萃取

写泛型框架&库的时候, 可能会用到这些东西; 其他时候, 很少用到.

Type traits, 类型特征, 除此之外还有iterator traits, 可以得到迭代器的特征;
以及funtion traits:

例如:

1
2
3
4
5
6
7
8
9
10
is_array
is_class
is_enum
//...
is_const
is_pod
is_volatile
//...
is_move_assignable
is_trivially_assignable

所谓trivial是指平淡无奇的, 通俗说就是类没有指针成员, 仅仅依靠编译器默认生成的Big-three就可以完成任务.

上面, 这些大概30多个, 没必要全部列出来, 可以去查手册.

如果使用类型的话, 我直接去拿就好了; 为什么还需要这个多此一举?

萃取器相当于在接口和实现之间加一层封装,来隐藏一些细节并协助调用合适的方法,比如容器, 迭代器和算法. 算法是不知道具体的容器类型的, 它也不关心.
但是容器可能会关心一下它的元素.

之所以要看, 要检查这些特性, 为的就是一些效率场景, 比如说容器需要大幅度搬动(拷贝)元素的时候, 它就需要知道元素类型的一些信息.

他们都是函数模板, 会根据调用时传入的类型, 特化出具体的模板函数, 调用返回值一般是boolean值.

这些模板的实现, 全部借助类(struct)模板(包括泛化和特化版本), 涉及元编程(元编程不好讲, 需要个人领悟; 写库的人比较喜欢用继承, 关系复杂), 所以不再深入.
(其中有一些, 是没有源码的, 比如追踪到__is_class, __is_pod都没有提供源码, 让编译器回答&实现)

这需要一些技巧(例如,偏特化)

具体内容可以参考一下《STL源码剖析》, 我暂时先啃到这里.


有一篇文章分析的很好, 见下: http://www.cnblogs.com/mangoyuan/p/6446046.html

但是, 你读完, 马上会联想到template alias 中谈到了通过临时对象获取相关类型信息以及通过偏特化版本拿到拿到最匹配的类型.

文章目录
|