C++ 模板特化

2023-11-19

  • 模板的特化

在使用模板时,可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果。这时就一些需要特殊处理(对模板进行特化)。

在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。

模板特化又分为:函数模板特化、类模板特化。
 

  • 函数模板特化

template<class T> 
bool IsEqual(T& left, T& right) 
{    
    return left == right; 
}
 

上述模板判断是否相等。若我们传两个字符串进行比较,对于字符串而言不能直接比较。因不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数(就是写出一个模板函数专门给该类型使用)。

函数模板特化规则:

1. 必须要先有一个基础的函数模板

2. template后接空的尖括号<>

3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型

4. 函数形参表: 必须要和模板函数的基础参数类型完全相同

加上下面这段特化字符串就能比较了

template<> 
bool Isequal<char*>(char*& p1, char*& p2){
	return strcmp(p1, p2) == 0;
}

 

  • 类模板特化 

类模板特化又分为:全特化、偏特化。

全特化:将模板参数类表中所有的参数都确定化

template <class T1, class T2>
class Test1{
}

//全特化
template <> 
class Test1<int , char>{
}

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。 

偏特化又为两种:部分特化、参数更进一步限制。

            部分特化:将模板参数类表中的一部分参数特化

template <class T1, class T2>
class Test2{
}

//部分特化
template <class T1>  //此处只需写未进行特化的模板类型,特化过的就不用写
class Test2<T1 , char>{
}

           参数更进一步限制

template <class T1, class T2>
class Test2{
}

//两个参数偏特化为指针类型
template <class T1 , class T2 >  
class Test2<T1* , T2*>{
}
//两个参数偏特化为引用类型
template <class T1 , class T2 >  
class Test2<T1& , T2&>{
}

Test2<double , char> d1;           // 调用特化的char版本    

Test2<int , double> d2;              // 调用基础的模板        

Test2<int *, int*> d3;                  // 调用特化的指针版本    

Test2<int&, int&> d4(1, 2);        // 调用特化的引用版本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板特化 的相关文章

  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 在 C++ 中,严格别名规则中的“访问”是什么意思?

    3 10 10 说 如果一个程序试图access通过除以下类型之一之外的泛左值存储对象的值 行为未定义 然而 术语 访问 并没有在任何地方定义 在这种情况下这意味着read or 读取或修改 在 C 标准中 它被明确定义为读取或修改 然而在
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • git cmd!!!!!!!

    cd e 进入磁盘 mkdir gitdemo 创建目录 cd gitdemo 进入目录 pwd 显示目录 git init 把这个目录变成Git可以管理的仓库 如果你没有看到 git目录 那是因为这个目录默认是隐藏的 用ls ah命令就可
  • 【Docker系列】从头学起 Docker——docker --help命令详解

    文章目录 前言 一 学会使用 docker help 命令 二 docker help进阶方法 总结 前言 当你在docker容器时相信docker help一定可以帮助到你 一 学会使用 docker help 命令 即使忘记相关命令 也
  • Linux操作系统安全配置

    Linux操作系统安全配置 一 服务相关命令 systemctl enable 服务名 开机自启动 systemctl disable 服务名 禁用开机自启动 systemctl stop 服务名 停止服务 systemctl start
  • 利用 FFmpeg 批量自动生成视频封面

    最近有一个 H5 页面的需求 里面有非常多的视频 由于视频在 H5 中播放缓冲较慢 因此需要在每一个视频前面加上一个封面 从而来避免白屏的情况 主要使用的 ffmpeg 的语法 ffmpeg i input mp4 ss 00 00 00
  • 小白能看懂等Tacotron 中文语音合成实践

    简介 参考博客1 基于Tacotron汉语语音合成的开源实践 参考博客2 Tacotron中文语音合成 通过调研发现 针对TTS的开源项目主要是针对英文的 而中文方面资料相对较少 上面两个为本项目的主要参考 已有的信息就不进行重复了 同时感
  • 第一节:Keras深度学习框架之环境搭建

    请在学习本节前阅读我们之前的预热课程 卷积神经网络的框架解读 上 BBM的开源HUB的博客 CSDN博客 卷积神经网络的框架解读 下 BBM的开源HUB的博客 CSDN博客 从本节开始 我们将进入到Keras的详细介绍和代码精读 为开始我们
  • 如何设置淘宝镜像?

    在国外 受网速影响比较大 https registry npmjs org 1 配置 npm 为淘宝镜像 npm config set registry https registry npm taobao org 2 安装 cnpm 为淘宝
  • jdbc mysql url utf8_JDBC获得数据库连接时写在URL上的?useUnicode=true&characterEncoding=utf-8的意义...

    JDBC作为Java与数据库的桥梁 是JavaWeb后台的基础之一 需要我们熟悉其原理与用法 JDBC一般的使用步骤为 1 运用反射加载驱动程序 如Class forName com mysql jdbc Driver 2 获得数据库连接对
  • JVM类加载机制详解(一)JVM类加载过程

    首先Throws 抛出 几个自己学习过程中一直疑惑的问题 1 什么是类加载 什么时候进行类加载 2 什么是类初始化 什么时候进行类初始化 3 什么时候会为变量分配内存 4 什么时候会为变量赋默认初值 什么时候会为变量赋程序设定的初值 5 类
  • stm32编码器模式

    选择编码器接口模式的方法是 如果计数器只在TI2的边沿计数 则置TIMx SMCR寄存器中的 SMS 001 如果只在TI1边沿计数 则置SMS 010 如果计数器同时在TI1和TI2边沿计数 则 置SMS 011 TI1FP1和TI2FP
  • 游戏开发unity编辑器扩展知识系列:一个方法添加至多个MenuItem

    代码如下 用多个MenuItem标记方法就可以了 MenuItem GameObject 生成带图片的Image false 100 MenuItem Assets 生成带图片的Image static void GenImageGameO
  • 解决electron-builder打包很慢的问题

    由于网络原因 各种包下载不下来 导致出错 1 打包时下载 electron v10 1 4 win32 x64 文件失败 解决方法 直接在 淘宝的文件库 下载对应版本文件 下载完成后放在C Users renlei AppData Loca
  • 要求输入月份,判断该月所处的季节并输出季节(假设:12、1、2 月为冬季,依次类推)

    public class Task 10101003 03 public static void main String args Scanner input new Scanner System in System out println
  • Docker 从入门到精通(二) 搭建本地仓库

    导读 docker 是Linux下面的容器技术 是目前最火的开源技术之一 上次我们了解了docker的基础知识 docker的容器 仓库 镜像等 接下来我们就一起来看下本地仓库的搭建吧 一 本地安装 yum install y python
  • Vuex有那几种状态和属性?

    vuex的流程 页面通过mapAction异步提交事件到action action通过commit把对应参数同步提交到mutation mutation会修改state中对于的值 最后通过getter把对应值跑出去 在页面的计算属性中 通过
  • visual studio 2019工程移植到vs2017上

    系列文章目录 文章目录 系列文章目录 前言 一 解决方法 1 首先确认vs2019上的lib和dll版本是32位的还是64位 2 使用vs2017把相关的lib和dll编译一下 3 vs2019和vs2017相关项目配置 二 vs2019相
  • Qt实现窗口同比例放大/缩小

    实现思路 Qt中有resizeEvent事件 该事件当窗口大小改变时便会产生响应 所以可利用此来实现窗口同比例缩放问题 但是由于resizeEvent事件是随着窗口大小改变不断刷新的 因此在重写resizeEvent时 直接改变窗口大小 代
  • Python-with open() as f的用法

    常见的读写操作 with open r filename txt as f data user pd read csv f 文件的读操作 with open data txt w as f f write hello world 文件的写操
  • python3.10+selenium4.9.1初始化安装踩坑记

    2023年了 又开始捯饬web UI自动化 前些年appium写的比较多 现在又开始依据记忆中对于selenium的留存 开始练习用python来写 一 安装 首先 pycharm安装 python3 10安装 python环境变量设置为前
  • C++ 模板特化

    模板的特化 在使用模板时 可以实现一些与类型无关的代码 但对于一些特殊类型的可能会得到一些错误的结果 这时就一些需要特殊处理 对模板进行特化 在原模板类的基础上 针对特殊类型所进行特殊化的实现方式 模板特化又分为 函数模板特化 类模板特化