功能

  类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型.

  简述来说可以用来判断出某个变量是内置类型还是自定义类型.

  通过类型萃取,萃取到变量类型,对不同变量进行不同处理,可以提升程序效率.

应用场景

  比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.

  拷贝对象时,就有两种情况:一种是类型,比如int char...;还有一种是自定义类型,Data类、String类.

  对于内置类型,我们可以通过memset,来进行赋值.(扩展,浅拷贝相关的类也可以通过memset赋值)

  而对于自定义类型,大多数深拷贝的对象来说,我们必须通过调用赋值语句来赋值.

  因此,我们通常在拷贝对象时,为了不出现错误,都用赋值语句来赋值.

  而我们如果有一种方法/机制可以判断POD类型或者非POD类型.

  对于POD类型用memset函数,对于非POD用赋值,这样就能提高程序的效率

实现

  类型萃取,在技术层面,就是利用了模板的特化.

  简单类型萃取的实现代码:

  1. template<typename T>
  2. struct TypeTraits{
  3. static bool IsPODType(){
  4. return false;
  5. }
  6. };
  7. //特化int
  8. template<>
  9. struct TypeTraits<int>{
  10. static bool IsPODType(){
  11. return true;
  12. }
  13. };
  14. //特化unsigned int
  15. template<>
  16. struct TypeTraits<unsigned int>{
  17. static bool IsPODType(){
  18. return true;
  19. }
  20. };
  21.  
  22. template<>
  23. struct TypeTraits<char>{
  24. static bool IsPODType(){
  25. return true;
  26. }
  27. };
  28.  
  29. template<>
  30. struct TypeTraits<unsigned char>{
  31. static bool IsPODType(){
  32. return true;
  33. }
  34. };
  35.  
  36. template<>
  37. struct TypeTraits<short>{
  38. static bool IsPODType(){
  39. return true;
  40. }
  41. };
  42.  
  43. template<>
  44. struct TypeTraits<unsigned short>{
  45. static bool IsPODType(){
  46. return true;
  47. }
  48. };
  49. //.....更多类型,继续特化就好

  测试代码:

  1. #include<iostream>
  2. template<typename T>
  3. void CheckTypeTraits(T &v){
  4. std::cout<<v<<"是POD类型?"<<TypeTraits<T>::IsPODType()<<std::endl;
  5. }
  6.  
  7. int main(){
  8. int a = 1;
  9. char b = '2';
  10. short c = 3;
  11. float d = 4.4; //没有特化处理,因此返回0
  12. CheckTypeTraits(a);
  13. CheckTypeTraits(b);
  14. CheckTypeTraits(c);
  15. CheckTypeTraits(d);
  16. return 0;
  17. }

【C++】模板简述(五):类型萃取的更多相关文章

  1. STL的迭代器和类型萃取

    今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...

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

    应该说,迭代器就是一种智能指针,因此,它也就拥有了一般指针的所有特点——能够对其进行*和->操作.但是在遍历容器的时候,不可避免的要对遍历的容器内部有所了解,所以,设计一个迭代器也就自然而然的变 ...

  3. 类型萃取(type traits)

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

  4. 第17课 类型萃取(1)_基本的type_traits

    1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异.在程序设计中可以使用这些tra ...

  5. c++11——type_traits 类型萃取

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

  6. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  7. C++类型萃取

    stl中的迭代器和C++中的类型萃取: http://www.itnose.net/detail/6487058.html 赐教!

  8. 第19课 类型萃取(3)_类型选择的traits

    1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T ...

  9. 第18课 类型萃取(2)_获取返回值类型的traits

    1. 获取可调用对象返回类型 (1)decltype:获取变量或表达式的类型(见第2课) (2)declval及原型 ①原型:template<class T> T&& d ...

随机推荐

  1. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词的数据集预处理成作者提到的格式,即可很快的就迁移了这个代码到中文分词中,相关的代码后续将会分享. 具体的数据格式,这种方式并不适合处理 ...

  2. CRM2011部署问题小结

    1 CRM2011部署当插件太多,并且文件太多的时候选择硬盘部署 2 在生产环境这样复杂的CRM2011部署环境的时候弄清楚每台CRM服务器的结构是很重要的弟一步 3 一定要注意DMZ区和内网隔离的, ...

  3. jquery中注意点

    1.jquery.fn.extend和jquery.extend jquery.fn.extend是向jquery中的prototype中添加方法或者属性,而jquery.extend是向jquery ...

  4. 并不对劲的bzoj5341:loj2553:uoj400:p4565:[Ctsc2018]暴力写挂

    题目大意 有两棵\(n\)(\(n\leq366666\))个节点的树,\(T\)和\(T'\),有边权 \(dep(i)\)表示在\(T\)中\(i\)号点到\(1\)号点的距离,\(dep'(i) ...

  5. asp.net mvc4 controller

    controller返回几种返回结果

  6. 洛谷 P3254 圆桌问题【最大流】

    s向所有单位连流量为人数的边,所有饭桌向t连流量为饭桌容量的边,每个单位向每个饭桌连容量为1的边表示这个饭桌只能坐这个单位的一个人.跑dinic如果小于总人数则无解,否则对于每个单位for与它相连.满 ...

  7. 【插件开发】—— 12 GEF入门

    介绍 前面也简单的介绍了一下插件开发的相关知识,下面主要就介绍一下GEF的相关使用.由于最近使用到编辑器这部分的操作,因此就跳过其他的内容,先介绍下GEF的相关知识. 前文回顾 1 插件学习篇 2 简 ...

  8. BIOS 和UEFI的区别

    BIOS先要对CPU初始化,然后跳转到BIOS启动处进行POST自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程:而UE ...

  9. 传统的线程互斥技术:Synchronized关键字

    多个线程操作同一个方法或变量时常常出现错误,要保证每个线程都正常运行就要通过加锁,每次只有一个能够拿到锁通过.如下: package cn.sp.thread; /** * Created by 2Y ...

  10. 《windows核心编程系列》一谈谈windows中的错误处理机制

    错误处理 我们写的函数会用返回值表示程序执行的正确与否,使用void,就意味着程序一定不会出错.Bool类型标识true时为真,false时为假.其他类型根据需要可以定义成不同意义. Windows除 ...