作用

类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来达到提高效率或者其他的目的。

类型萃取的实现的基石是模板的偏特化和全特化,详解链接:https://blog.csdn.net/itworld123/article/details/104718336 。

实例说明

这里采用的实例是 STL 的 destroy() 函数的实现,原型如下图所示:(stl_contruct.h)

该函数的作用是析构 [ first , last ) 范围内的对象。

这里面就有个问题,ForwardIterator 是否是类对象,如果是的话就可以执行其析构函数,否则是不进行任何处理的。现在的关键就是怎么才知道 ForwardIterator 的数据类型是属于哪一类呢?

为了解决上述问题,这里面就需要使用类型萃取技术了。

首先我们通过 value_type(first) 获取到了模板的数据类型。进入 __destroy() 函数,如下所示:(stl_contruct.h)

好的,关键时刻来了!trivial_destructor 就决定了类型 T 是否含有析构函数!它是如何被声明的呢?这里需要看下 __type_traits<T> 的代码,如下所示:(type_traits.h)

struct __true_type
{
};struct __false_type
{
};template <class type>
struct __type_traits
{typedef __false_type    has_trivial_default_constructor;typedef __false_type    has_trivial_copy_constructor;typedef __false_type    has_trivial_assignment_operator;typedef __false_type    has_trivial_destructor;typedef __false_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<char>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<signed char>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<unsigned char>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<short>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<unsigned short>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<int>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<unsigned int>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<long>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<unsigned long>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<float>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<double>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};__STL_TEMPLATE_NULL struct __type_traits<long double>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};template <class T>
struct __type_traits<T*>
{typedef __true_type    has_trivial_default_constructor;typedef __true_type    has_trivial_copy_constructor;typedef __true_type    has_trivial_assignment_operator;typedef __true_type    has_trivial_destructor;typedef __true_type    is_POD_type;
};

上述代码中充斥着 __type_traits 的原生版本、偏特化版本以及全特化版本,也就是说,STL采用穷举的方案,解决了如何判断各种数据类型是否有析构函数的问题。

若 has_trivial_destructor = __true_type,则类型 T 不是类类型,所以不需要进行析构,执行代码如下:(stl_contruct.h)

若 has_trivial_destructor = __false_type,则类型 T 是类类型,所以需要进行析构,执行代码如下:(stl_contruct.h)

这样就完成了 destroy() 函数的功能。

参考:https://blog.csdn.net/dawn_sf/article/details/70038126

(SAW:Game Over!)

C/Cpp / STL / 类型萃取相关推荐

  1. C++的类型萃取技术

    http://www.cppblog.com/nacci/archive/2005/11/03/911.aspx?spm=0.0.0.0.iyJqvt&file=911.aspx 自从C++中 ...

  2. C++ 模板类型萃取技术 traits

    当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案.(类型测试发生在编译期 ...

  3. [c++]——什么是类型萃取

    类型萃取 类型萃取从字面意思上来说其实就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事. C++中的类型萃取并不是每个人都熟知,他们一般都出现在STL库底层的实现原理中,和笔者一样,相信听到 ...

  4. C++ — 类型萃取

    类型萃取 在编程中我们可能时常会听到类型萃取这个高大上的"学术名词",我们今天来探究一下这个高大上的学术名词 到底是何方神圣,先看看官方的解释类型萃取使用模板技术来萃取类型(包含自 ...

  5. C++模板编程之类型萃取 惊鸿一瞥

    一.从模板函数std::distance(计算迭代器的距离)开始 #include <iostream> #include <vector> #include <list ...

  6. C++特化的应用——类型萃取

    提出问题:如何实现一个对于拷贝内置类型和自定义类型通用的拷贝函数? 1.拷贝内置类型 对于内置类型我们可以用memcpy进行拷贝,因为memcpy属于浅拷贝,内置类型不涉及资源管理的问题. 2.拷贝自 ...

  7. C++之类型萃取技巧

    使用类型萃取的原因 就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储存少于16个的时候这时会储存在_buf ...

  8. C++类型萃取之type_traits和type_info

    类型萃取 类型判断 typeid decltype和declval enable_if 类型萃取 通过type_traits可以实现在编译期计算.查询.判断.转换和选择,增强了泛型编程的能力,也增强了 ...

  9. type_traits 类型萃取

    一. c++ traits traits是c++模板编程中使用的一种技术,主要功能: 把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits ...

最新文章

  1. 9,线程池 threadPool 与 线程池执行器 threadPoolExecutor
  2. Makefile文件试错
  3. [html] H5如何与APP交互?有哪些方式?
  4. 子系统单点登录配置说明
  5. 音游android平板,音游专题 - 有时候听歌远远不够,试试这些音游吧 - Android 应用 - 【最美应用】...
  6. 【Python开发】Python中的class继承
  7. Flickr 网站架构分析
  8. 【论文写作】在线考试系统的设计原理如何写
  9. 云计算的概念、发展历史、痛点、以及未来展望
  10. 关于如何把用手机查看原型
  11. IM即时通讯需要解决的问题
  12. Python音乐下载
  13. 开发STM32相关资料下载
  14. 灵魂深处的眼泪 秋枫
  15. 小猫爪:S32K3学习笔记11-S32K3之FCCU
  16. 基于stm32及LM041L的对角棋游戏
  17. 零售药店计算机操作内容培训,零售药店的年度培训记录.docx
  18. 【面试_01】IBM 校招面试
  19. 这个技术发展到现在就为了让你能愉快地多打几局游戏
  20. 完成贺年卡的编写(万能模板)

热门文章

  1. 是不是用博客园编辑器插入修改图片好困难?怀念Word吧,看看用Word2010发博客教程吧~...
  2. PingingLab传世经典系列《CCNA完全配置宝典》-5.8 静态NAT
  3. 哪吒之魔童降世 - 逆天改命,若命运不公,就和它斗到底!
  4. 【5分钟搞定】如何将py打包成exe可执行文件
  5. 【帖子收藏】ansible 中的循环:with_file 和 with_fileglob
  6. linux截图快捷键
  7. HBase 2.0 之修复工具 HBCK2 运维指南
  8. spark on yarn简单部署
  9. scala中_下划线的使用
  10. Zuul默认路由规则