模板的类型萃取

2023-11-10

初次接触类型萃取是在运用模板实现seqlist的时候,拷贝构造和赋值运算符重载时,单纯的使用memcopy(),函数进行拷贝,只是单纯的进行了浅拷贝,对于基本的数据类型是不会有任何错误的,但是如果是string类型时,单纯的值拷贝显然是不行的(超过了给定的buffer空间时),指向了同一块开辟的空间,然后析构时会出现问题。所以一开始直接调用赋值运算符的重载,这样显然不会出现问题,但是对基本的数据类型而言,这样调用的效率显然是没有直接使用memcopy()高效的。

所以类型萃取的出现就是很有必要的,将无关痛痒的类型直接使用memcopy()进行拷贝,其余的使用赋值运算符的重载来进行实现。

类型萃取是在模板的基础上区分内置类型和其他类型,原理是将内置类型全部特化,然后再进行区分。
//类型萃取
#include<iostream>
using namespace std;
struct __TrueType
{
 bool Get()
 {
  return true;
 }
};
struct __FalseType
{
 bool Get()
 {
  return false;
 }
};
template <class _Tp>
struct TypeTraits
{
 typedef __FalseType __IsPODType;  //不是内置类型则为 __FALSETYPE
};

//内置类型全部特化
template <>
struct TypeTraits< bool>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< char>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< unsigned char >
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< short>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< unsigned short >
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< int>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< unsigned int >
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< long>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< unsigned long >
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< long long >
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< unsigned long long>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< float>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< double>
{
 typedef __TrueType __IsPODType;
};
template <>
struct TypeTraits< long double >
{
 typedef __TrueType __IsPODType;
};
template <class _Tp>
struct TypeTraits< _Tp*>
{
 typedef __TrueType __IsPODType;
};
template<typename T>
void Copy(const T* src, T* dst, size_t size)
{
 if (TypeTraits <T>::__IsPODType().Get() == 0)  //不是内置类型
 {
  cout << "赋值运算符重载" << endl;
  for (size_t i = 0; i < size; ++i)
  {
   dst[i] = src[i];
  }
 }
 else
 {
  cout << "使用memcpy()" << endl;
  memcpy(dst, src, size*sizeof(T));
 }
}
void Test1()
{
 string s1[10] = { "1", "2", "3", "4444444444444444444444444" };
 string s2[10] = { "11", "22", "33" };
 Copy(s1, s2, 10);
 Copy(s1, s2, 10);

 int a1[10] = { 1, 2, 3 };
 int a2[10] = { 0 };
 Copy(a1, a2, 10);
 Copy(a1, a2, 10);
}
int main()
{
 Test1();
 system("pause");
 return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板的类型萃取 的相关文章

  • unbuntn X64 安装vsftpd

    Fortunately the good folks at The Fronteer Group have backported vsftp until the full release of ver 3 of vsftp comes ou
  • 【限时免费】20天拿下华为OD笔试之【栈】2023B-仿 LISP 运算【欧弟算法】全网注释最详细分类最全的华为OD真题题解

    栈 2023B 仿 LISP 运算 题目描述与示例 题目描述 LISP 语言唯一的语法就是括号要配对 形如 OP P1 P2 括号内元素由单个空格分割 其中第一个元素 OP 为操作符 后续元素均为其参数 参数个数取决于操作符类型 注意 参数
  • JavaScript slice() 和 splice()

    slice slice 从已有的数组中返回选定的元素 返回一个新的数组 包含从 start 到 end 不包括该元素 的 arrayObject 中的元素 arrayObject slice start end 参数 start 必须 规定
  • 抽象类与接口(Java)

    二者的特性 方法类型 接口只能有抽象方法 抽象类可以有抽象方法和非抽象方法 从Java 8 开始 抽象类可以有默认 default 方法和静态方法 Final变量 接口中的变量默认是final的 抽象类可能包含非final的变量 变量类型
  • 基于Apache Hudi + MinIO 构建流式数据湖

    Apache Hudi 是一个流式数据湖平台 将核心仓库和数据库功能直接引入数据湖 Hudi 不满足于将自己称为 Delta 或 Apache Iceberg 之类的开放文件格式 它提供表 事务 更新 删除 高级索引 流式摄取服务 数据聚簇
  • 华为oj初级 在字符串中找出连续最长的数字串

    描述 样例输出 输出123058789 函数返回值9 输出54761 函数返回值5 接口说明 函数原型 unsignedint Continumax char pOutputstr char intputstr 输入参数 char intp
  • 使用DataX和sqoop将数据从MySQL导入Hive

    使用DataX和sqoop将数据从MySQL导入Hive 一 DataX简述 二 sqoop简述 三 需求背景 四 实现方式 3 1 使用DataX将数据从MySQL导入Hive 3 2 通过sqoop将数据从MySQL导入Hive 四 总
  • 解决重启Linux服务器后数据消失问题(重新挂载)

    目录 一 挂载 1 重新挂载 2 数据消失的原因 二 重启服务器 1 shutdown 2 其它关机重启指令 参考自 一 挂载 1 重新挂载 使用 reboot 命令重启服务器后 服务器内挂载的文件全部丢失 那应该如何重新挂载呢 我们想将1
  • 【满分】【华为OD机试真题2023 JS】任务总执行时长

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 任务总执行时长 知识点数组循环递归 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长
  • SDL2.0渲染图像

    SDL封装了opengl和directx包含图像显示和音频播放 SDL的API文档 https wiki libsdl org SDL渲染图像的步骤 1 初始化接口 int SDLCALL SDL Init Uint32 flags 2 创
  • mmdetection目标检测训练过程参数解读

    关于训练过程中日志记录的的map 包含很多map 如下 mode train epoch 100 iter 400 lr 0 0002 memory 5010 data time 0 01552 loss rpn cls 0 00029 l
  • 雾化

    https www cnblogs com kenkao archive 2011 08 14 2137726 html 风动和雾化都是相对而言比较简单的游戏特效 实现起来甚至比我们前一节提到的晴天光晕还要简单 大家还记得上上节中我们为陆地
  • C语言怎么才能学好

    多做题 多上机练习
  • 什么!网络安全工程师就是网管?这是他们被黑的最惨的一次!

    什么 网络安全工程师就是网管 这是他们被黑的最惨的一次 经常会有人问我 小伙子你是做什么工作的 我 网络安全工程师 接下来就会有一大堆疑问 A 网管 网吧管理员 B 就是修电脑的 给电脑装杀毒软件的 C 是不是开发游戏 开发操作系统的 首先
  • 【Java】基本类型之int(五)

    int 数据类型是32位 有符号的以二进制补码表示的整数 最小值是 2 147 483 648 2 31 最大值是 2 147 483 647 2 31 1 一般地整型变量默认为 int 类型 默认值是 0 例子 int a 100000
  • web和servlet一样的用法但是有区别

    转载于 https www cnblogs com Koma vv p 10220260 html
  • 使用ServerSocket和Thread写一个简单的web服务器小程序,山寨版Tomcat

    需求 写一个模拟服务器小程序 当服务器开启后 多个浏览器客户端可以并发访问 服务器获取浏览器的请求信息 并反馈信息给浏览器 效果如下 编译并开启 运行 服务器 服务器处于阻塞状态 等待浏览器的访问 谷歌浏览器访问成功 服务端的访问信息 一个
  • Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    转载请注明出处 http blog csdn net guolin blog article details 9255575 最近项目中需要用到ListView下拉刷新的功能 一开始想图省事 在网上直接找一个现成的 可是尝试了网上多个版本的
  • Java基础——常量、进制、变量、数据类型及运算符

    今天呢阿Q就带大家了解一下java的常量 变量 数据类型以及运算符的相关知识 常量 1 在程序的运行过程中 其值是不可以发生改变的量 2 常量的分类 字面值常量 自定义常量 将在后边的讲解中给出 字面值常量又分为 整数常量 12 23 实数
  • 设计模式之工厂模式

    目录 使用场景 简单工厂模式 工厂方法模式 抽象工厂模式 参考 Java设计模式 工厂模式 IT longlong 博客一 简单工厂模式 简单工厂模式就是把对类的创建初始化全都交给一个工厂来执行 而用户不需要去关心创建的过程是什么样的 只用

随机推荐