C++ 模板特例化

2023-11-13

介绍

模板作为C++泛型编程的基础十分重要,其使得一份代码能用于处理多种数据类型。而有些时候,我们会希望对一些特定的数据类型执行不同的代码,这时就需要使用模板特例化(template specialization)。

函数模板特例化

首先说一个重要的,函数模板的特例化并不是函数重载,每一个特例化实际上是提供了另一个模板定义式,因此特例化不影响函数匹配。

特例化一个函数模板时,必须为模板中的每个参数都给出实参,关键字template后跟一个<>

template<typename T,typename P>
void test(T, P) {

}
template<>
void test(int a){
	/*错误,没有提供模板中的每个参数*/
}

template<>//一个函数模板特例化
void test(string a,int b) {
	cout << a << endl;
}

template<>//又一个函数模板特例化
void test(int a,char b) {
	cout << a << ' ' << b <<endl;
}

{
	string s{ "abc" };
	test(1, 1);//调用非特例化模板test(T,P)
	test(s, 1);//调用特例化版本test(string,int)
	test(1, 'a');//调用特例化版本test(int,char)
}

类模板特例化

类模板中,提供所有实参时叫做全特化,类模板的全特化和函数模板的特例化上没有什么不同(除了一个是类模板一个是函数模板:D)

与函数模板必须为每个模板参数提供实参不同,类模板支持部分特例化,也叫偏特化(partial specialization),STL源码分析中引用了两个对其的定义:

[Austern99]:“所谓偏特化(partial specialization)的意思是提供另一个模板(template)定义式,其本身仍为模板化基类(templatized)”。

《泛型思维》:“针对(任何)模板参数更进一步的条件限制设计出来的一个特化版本”。

当定义类模板的偏特化版本时,模板参数只需包含原模板中那些还未确定类型的模板参数,在类名之后需要添加<>,且需要按对应位置填入实参。

template<typename T, typename P>
class test {
public:
	test() { cout << "这是未特化的类模板\n"; }
};

template<typename P>//T被特化为bool类型,template<>中无需typename T
class test<bool,P> {
public:
	test() { cout << "这是bool偏特化的类模板\n"; }
};

template<>//全特化,template<>可以为空
class test<int*, int*> {
public:
	test(){ cout << "这是接受两个指针类型的全特化的类模板\n"; }
};

{
	test<int*, int> t1;//会调用未特化的类模板
	test<bool,int> t2;//会调用bool偏特化
	test<int*, int*> t3;//全特化版本
}

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

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

随机推荐

  • Ubuntu 20.04-NVIDIA显卡驱动-安装和卸载-解决黑屏问题

    这一步很重要 202300704更新 黑屏问题主要由linux内核更新导致 一定要保持当前的内核 也就是安装 NVIDIA 驱动时用的内核 sudo apt mark hold linux image generic linux heade
  • Cuda矩阵运算库cuBLAS介绍

    文章目录 简介 cuBLAS库新特性 cuBLAS代码热身 cublasSetMatrix cudaMalloc cublasSscal 源代码 cuBLAS 辅助函数 上下文管理 复制矩阵 数据类型标示 cuBLAS 运算函数 矩阵相乘
  • 有趣的 Async hooks 模块

    在 Node js 中 Async hooks 是一个非常有意思且强大的模块 虽然性能上存在一些问题 在 APM 中 我们可以借助这个模块做很多事情 本文介绍两个有趣的用法 AsyncLocalStorage 在 Node js 中 上下文
  • PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线!

    挑战自我 拓展技能 激发创新 挑战极限 再次相遇黑客松 我们期待你的加入 第五期 PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线 本次活动是面向全球开发者的深度学习领域编程活动 鼓励开发者了解和参与飞桨深度学习开源项
  • 如何制作一个简单的网页

    先创建一个文本文档 将后缀名改为 html 然后右击这个 选择打开方式 用记事本打开 开头与结尾要用来写 后一个要加 头部用head 中间部分用body 背景颜色用bgcolor 填一种颜色 字体颜色用text 填一种颜色 切记用英文 你如
  • ubuntu16.04 安装交叉编译工具aarch64-linux-gnu-gcc/g++

    前言 最近需要把人脸识别代码放到RK3399Pro的嵌入式板子上 所以编写好的c 代码要放到板子上编译 或者在ubuntu系统上使用交叉编译工具 编译好可执行文件在放到板子里运行 为了在能在ubuntu系统上能交叉编译 安装aarch64
  • 复杂场景下智能汽车目标检测心得体会

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 引言 一 复杂背景目标检测的复杂是什么 二 目标检测环境的复杂性包含哪些 三 复杂场景目标检测的目标复杂性包含哪些 四 复杂场景目标检测的算法复杂性包含什么 五 总
  • 微信小程序使用face++实现人脸识别登录注册

    Face 是一个 人工智能开放平台 要使用它我们得先注册并进入控制台创建API Key 这是前提 平台网址 https www faceplusplus com cn 整个项目代码我已经上传到网盘 链接 https pan baidu co
  • 高频面试题:服务器CPU占用过高怎么办?搞定只需简单7步

    一 前言 在Java开发岗位的面试中 时不时会出现一些运维类的题目 其实这也反映了后端面试的一种趋势 现在企业对后端开发的要求越来越全面 不仅要求我们会写代码 还要我们能够进行部署和运维 今天九哥就结合一个真实的项目案例 来给大家讲解一道关
  • C语言中局部变量和全局变量在内存中的存放位置

    C语言中局部变量和全局变量变量的存储类别 static extern auto register 1 局部变量和全局变量 在讨论函数的形参变量时曾经提到 形参变量只在被调用期间才分配内存单元 调用结束立即释放 这一点表明形参变量只有在函数内
  • 信号是如何传输的

    一 信号 信息 人对现实世界事物存在方式或运动状态的某种认识 数据 用于描述事物的某些属性的具体量值 信号 信息传递的媒介 一 信号的分类 1 模拟信号 模拟信号是信号参数 幅度 频率等 大小连续变化的电磁波 可以以不同的频率在媒体上传输
  • springboot + vue 前端时间字符串,后台LocalDateTime 参数接收方法

    前端格式以 2020 05 09 10 55 22 这样的格式传值 后台实体类LocalDateTime 添加注解 即可接收到值 DateTimeFormat pattern yyyy MM dd HH mm ss JsonFormat p
  • day4:最长回文子串

    文章目录 问题描述 思路 实现代码 问题描述 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例 2 输入 cbbd 输出
  • [医疗相关任务]

    药物研发 GLAM
  • 【Linux】IO多路复用--poll函数基本处理流程

    poll 函数在服务端流程图 当我们的已连接套接字时间就绪 也就是connfd已连接套接字读事件就绪时候 那么我们就要读取接受缓冲区的数据 但是我们不能保证我们一次读取就能够读完 所以我们需要循环读取 那么就需要在应用层设置一个该connf
  • c:Bubble Sort

    file SortAlgorithm h brief 业务操作方法 VSCODE c11 author geovindu Geovin Du date 2023 09 19 ifndef SORTALGORITHM H define SOR
  • Opencv dft & idft

    Load an image cv Mat inputImage cv imread argv argc 1 0 Go float cv Mat fImage inputImage convertTo fImage CV 32F FFT st
  • HTML的无序列表、有序列表、自定义列表

    HTML的无序列表 1 无序列表是一个项目的列表 此列项目使用粗体圆点 典型的小黑圆圈 进行标记 无序列表始于 ul 无序列表 ul type disc li HTML li li CSS li li li ul ul
  • 函数的传递方式&不定长参数&参数解包

    文章目录 1 函数简介 2 函数的参数 2 1 形参和实参 2 2 函数的传递方式 2 2 1 位置传参 2 2 2 关键字传参 2 3 函数的实参类型 2 4 不定长参数 2 5 参数的解包 1 函数简介 函数也是一个对象 函数用来保存一
  • C++ 模板特例化

    文章目录 介绍 函数模板特例化 类模板特例化 介绍 模板作为C 泛型编程的基础十分重要 其使得一份代码能用于处理多种数据类型 而有些时候 我们会希望对一些特定的数据类型执行不同的代码 这时就需要使用模板特例化 template specia