使用类型萃取的原因

就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储存少于16个的时候这时会储存在_buf当中的,如果多于16个,那个会单独开辟空间,进行储存,这时拷贝的时候就是拷贝过去这个储存的地址而已,所以这样调用析构函数的时候,当增加容量的时候,这个时候会把储存string的那块空间进行释放。会造成数据丢失的问题。

所以,在这里面我们提到一个类型萃取的技巧,可以把自定义类型和内置类型的区分开,然后对自定义类型的使用for循环拷贝,对于内置类型的,采用memcpy的方式进行拷贝


#include<iostream>
#include<stdlib.h>using namespace std;//类型萃取
struct __truetype
{bool get(){return true;}
};struct __falsetype
{bool get(){return false;}};template<typename T>struct typetraits
{typedef __falsetype __ispodtype;};template<>
struct typetraits<int >
{typedef __truetype __ispodtype;
};template<>
struct typetraits<char >
{typedef __truetype __ispodtype;
};template<>
struct typetraits<short >
{typedef __truetype __ispodtype;
};template<>
struct typetraits<bool >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<unsigned int >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<unsigned short >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<unsigned long >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<long >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<long long >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<unsigned long long >
{typedef __truetype __ispodtype;
};template<>
struct typetraits<long double >
{typedef __truetype __ispodtype;
};
template<>
struct typetraits<double >
{typedef __truetype __ispodtype;
};template<>
struct typetraits<float >
{typedef __truetype __ispodtype;
};template<typename T>
void Copy(const T*src, T* dst, size_t size)
{if (typetraits<T>::__ispodtype().get()){cout << "__truetype:" << typeid(T).name() << endl;memcpy(dst, src, size*sizeof(T));}else{cout << "__falsetype:" << typeid(T).name() << endl;for (size_t i = 0; i < size; i++){dst[i] = src[i];}}}void test()
{int a1[8] = { 1, 2, 3, 4, 5, 6 };int a2[8] = { 9, 5, 6, 7, 8, 2, 2 };Copy(a1, a2, 3);cout << a2<<endl;string c1[10] = {"123","7989465","456321","4561","4563"};string c2[5] = {"654","312","a"};Copy(c1, c2, 3);}
int main()
{test();system("pause");return 0;
}

在这里我们采用了模板的特化,这里使用了全特化,直接给int,double等内置类型做特化。

在这里我们设定内置类型是truetype,设置自定义类型是falsetype,然后我们通过不同的类型利用get()函数返回不同的布尔值,这样对内置类型采用memcp拷贝,对于非内置类型,采用for循环拷贝,这样就能实现我们想要的结果了。

C++之类型萃取技巧相关推荐

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

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

  2. C/Cpp / STL / 类型萃取

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

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

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

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

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

  5. type_traits 类型萃取

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

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

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

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

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

  8. C++ — 类型萃取

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

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

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

最新文章

  1. TensorFow的基本使用
  2. 在win8上配置网站服务器,win8怎么配置web服务器地址
  3. Faster-RCNN的一些记录。
  4. 2.1 js 基础--select深入
  5. python中goto的用法_python3里用goto
  6. u盘分为windows和linux启动,【电脑软件】Ventoy 官方版,一个U盘,同时拥有启动win+linux+Ubuntu...
  7. 织梦缩略图自动补齐绝对路径_[教程]织梦CMS缩略图和文章内容图片自动转化为带域名的绝对路径...
  8. 线性表的定义和基本运算之线性结构
  9. centos7的网卡配置 实用经典总结
  10. 如何使用go打出hell word
  11. python的标准库学习之__buitin__
  12. CentOS 7 LNMP环境搭建 Zabbix3.4
  13. keras训练一个简单的模型
  14. VS2008 安装时 出现 “加载安装组件时出现问题,取消安装” 的解决方法
  15. 无法启动程序,.dll不是有效的Win32应用程序
  16. 众智日照服务器无响应,众智日照分析常见问题解释
  17. 283页K8S实战指南,内容详实,代码齐全可复制!
  18. 使用vscode利用vue脚手架创建项目每次修改代码都会频繁编译
  19. 搭建表白墙 公众号_韶大表白墙 第十季 第75期 | 篮球共青杯决赛体教1班穿黑色衣服的0号...
  20. 白嫖服务器——搭建个人简历网站(转载)

热门文章

  1. 点击事件触发选择提示框
  2. 利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
  3. 杭电2502--月之数
  4. Requirements of an SAP system administrator
  5. 马婕 2014MBA专硕考试 报刊选读 6(转)
  6. windows mobile创建文本文件并用word打开
  7. 洛谷 - P1989 无向图三元环计数(思维建图)
  8. CodeForces - 1288E Messenger Simulator(树状数组)
  9. POJ - 2513 Colored Sticks(字典树+并查集+欧拉回路)
  10. PAT (Basic Level) - 1025 反转链表(模拟)