写泛型框架&库的时候, 可能会用到这些东西; 其他时候, 很少用到.
Type traits, 类型特征, 除此之外还有iterator traits, 可以得到迭代器的特征;
以及funtion traits:
例如:
1 | is_array |
所谓trivial
是指平淡无奇的, 通俗说就是类没有指针成员, 仅仅依靠编译器默认生成的Big-three就可以完成任务.
上面, 这些大概30多个, 没必要全部列出来, 可以去查手册.
如果使用类型的话, 我直接去拿就好了; 为什么还需要这个多此一举?
萃取器相当于在接口和实现之间加一层封装,来隐藏一些细节并协助调用合适的方法,比如容器, 迭代器和算法. 算法是不知道具体的容器类型的, 它也不关心.
但是容器可能会关心一下它的元素.
之所以要看, 要检查这些特性, 为的就是一些效率场景, 比如说容器需要大幅度搬动(拷贝)元素的时候, 它就需要知道元素类型的一些信息.
他们都是函数模板, 会根据调用时传入的类型, 特化出具体的模板函数, 调用返回值一般是boolean值.
这些模板的实现, 全部借助类(struct)模板(包括泛化和特化版本), 涉及元编程(元编程不好讲, 需要个人领悟; 写库的人比较喜欢用继承, 关系复杂), 所以不再深入.
(其中有一些, 是没有源码的, 比如追踪到__is_class
, __is_pod
都没有提供源码, 让编译器回答&实现)
这需要一些技巧(例如,偏特化)
具体内容可以参考一下《STL源码剖析》
, 我暂时先啃到这里.
有一篇文章分析的很好, 见下: http://www.cnblogs.com/mangoyuan/p/6446046.html
但是, 你读完, 马上会联想到template alias
中谈到了通过临时对象获取相关类型信息
以及通过偏特化版本拿到拿到最匹配的类型
.