C++ - 非类型模版参数和模版的特化

news2025/1/12 3:51:35

目录

非类型模版参数

模版的特化

函数模版特化

类模版特化

全特化

半特化(偏特化)

参数更进一步的限制


非类型模版参数

在之前学过的例子来看,我们使用模版,它们的参数都是类型模版,根据类型来决定实例化

而模版其实还有一种参数,叫做 非类型模版参数

//非类型模版参数 --- 常量
template<typename T, size_t N>     
class array
{
private:
	T _arr[N];
};

int main()
{
	int a = 10;
	const int i = 10;
	fjz::array<int, a> arr1;   //a是变量,编译会报错
	fjz::array<int, i> arr2;   
	fjz::array<int, 10> arr3;
}

非类型模版参数,它是一个常量,所以如果要传参,也必须只能传一个常量,传变量会报错!!

模版的特化

C++支持了模版之后,给我们写代码带了了很大的便利,而模版的特化,更是近一步优化了模版的特点!

看这样一种场景

template<typename T>
bool less(T v1, T v2)
{
	return v1 < v2;
}

int main()
{
    int i1 = 5;
	int i2 = 4;

	int* p1 = &i1;
	int* p2 = &i2;

	cout << fjz::less<int>(i1, i2) << endl;
	cout << fjz::less<int*>(p1, p2) << endl;
	cout << endl;
}

如果我们不是想比较指针的大小,而是想比较指针解引用的数据的大小,那么遇上这种情况怎么办?  使用函数模版特化或者是类模版特化

函数模版特化

template<typename T>
bool less(T v1, T v2)
{
	return v1 < v2;
}

//函数模版特化格式
template<>
bool less<int*>(int* v1, int* v2)
{
	return *v1 < *v2;
}

这时我们就可以对于int* 这一类型进行专门的特化,一旦是发现T类型是int*,就会使用特化版本!

类模版特化

类模板的特化相对于函数模版的特化,多了几种特化形式,适用于不同的场景,更加灵活!

全特化

类模版的全特化与函数模版特化一样

//原模版
template<typename T1, typename T2>
class A {
public:
	void func(T1 t1, T2 t2)
	{
		std::cout << "class A" << std::endl;
	}
};

//全特化
template<>
class A<int, char> {
public:
	void func(int t1,char t2)
	{
		std::cout << "class A<int, char>" << std::endl;
	}
};

int main()
{
	A<int, int>().func();
	A<int, char>().func();

	return 0;
}

对于模版参数类型的不同,遇到特化相匹配的类型,会优先匹配优化版本的模版类。

半特化(偏特化)

顾名思义,只特化模版参数的某些参数,一些参数不进行特化。

//原模版
template<typename T1, typename T2>
class A {
public:
	void func()
	{
		std::cout << "class A" << std::endl;
	}
};

//全特化
template<>
class A<int, char> {
public:
	void func()
	{
		std::cout << "class A<int, char>" << std::endl;
	}
};

//半特化(偏特化)
template<typename T1>
class A<T1, char> {
public:
	void func()
	{
		std::cout << "class A<T1, char>" << std::endl;
	}
};

int main()
{
	A<int, int>().func();
	A<int, char>().func();
	A<char, char>().func();

	return 0;
}

 编译器会匹配 类型最为匹配的版本。

参数更进一步的限制

还有一种更为特别的特化,针对指针和引用

//原模版
template<typename T1, typename T2>
class A {
public:
	void func()
	{
		std::cout << "class A" << std::endl;
	}
};

//还有一种特化方式,专门特化指针和引用
template<typename T1, typename T2>
class A<T1*, T2*>
{
public:
	void func()
	{
		std::cout << "class A<T1*, T2*>" << std::endl;
	}
};

template<typename T1, typename T2>
class A<T1&, T2&>
{
public:
	void func()
	{
		std::cout << "class A<T1&, T2&>" << std::endl;
	}
};

template<typename T1, typename T2>
class A<T1*, T2&>
{
public:
	void func()
	{
		std::cout << "class A<T1*, T2&>" << std::endl;
	}
};

template<typename T1, typename T2>
class A<T1, T2&>
{
public:
	void func()
	{
		std::cout << "class A<T1, T2&>" << std::endl;
	}
};

int main()
{
	A<int, int>().func();
	A<int, char>().func();
	A<char, char>().func();
	A<int*, int*>().func();
	A<char&, char&>().func();
	A<char*, char&>().func();
	A<char, char&>().func();

	return 0;
}

  编译器会匹配 类型最为匹配的版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过Python的pdfplumber库提取pdf中表格数据

文章目录 前言一、pdfplumber库是什么&#xff1f;二、安装pdfplumber库三、查看pdfplumber库版本四、提取pdf中表格数据1.引入库2.定义pdf文件路径3.打开pdf文件4.获取pdf文件中的页数5.遍历每一页6.获取当前页内容7.提取表格数据8.输出表格数据9.效果 总结 前言 大家好&#…

聊聊美剧202306

刚把《黄石》系列看完&#xff0c;决定写点最近看的美剧&#xff0c;总共十一部&#xff0c;小评一下&#xff0c;写点东西~ 《黄石》 《黄石》已经到第五季了&#xff0c;看样子还得继续拍。刚开始看《黄石》的时候&#xff0c;确实有种陷进去的感觉&#xff0c;很美很宏伟的电…

leetcode 264.丑数

题目描述跳转去leetcode 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和/或 5 的正整数。 来源&#xff1a;leecode&#xff1a;https://leetcode.cn/problems/ugly-number-ii/ 解法1&#xff0c; 动态规划 定义一个数组用来记录前…

VMware Workstation 安装 AlmaLinux 9.2

VMware Workstation 安装 AlmaLinux 9.2 AlmaLinux 9.2 镜像下载AlmaLinux 9.2 安装创建新用户配置免密 sudo 到 root 用户配置 ssh key 登录挂载新磁盘 AlmaLinux 9.2 镜像下载 访问 https://mirrors.almalinux.org/isos.html 下载安装镜像&#xff0c; AlmaLinux 9.2 安装 …

K8s进阶7——Sysdig、Falco、审计日志

文章目录 一、分析容器系统调用&#xff1a;Sysdig1.1. 安装1.2 常用参数1.3 采集分析1.4 示例1.4.1 查看某进程系统调用事件1.4.2 查看建立TCP连接事件1.4.3 查看某目录下打开的文件描述符1.4.4 查看容器的系统调用 1.5 Chisels工具1.5.1 网络类1.5.2 硬盘类1.5.3 cpu类1.5.4 …

新型智慧园区解决方案之园区通行管理设计

智慧园区作为现代化城市化建设的重要组成部分&#xff0c;已经成为未来城市的重要发展方向。在智慧园区的建设中&#xff0c;通行管理是一个十分重要的问题。为了解决这一问题&#xff0c;我们需要进行一系列的设计和方案的制定。 一、园区交通规划设计 园区交通规划设计是通…

IIS总线介绍

IIS是飞利浦在1986年定义(1996年修订)的数字音频传输标准&#xff0c;用于数字音频数据在系统内器件之间传输&#xff0c;例如编解码器CODEC、DSP、数字输入/输出接口、ADC、DAC和数字滤波器等。其与IC无关联。 IIS总线的信号&#xff1a; BCLK&#xff0c;串行时钟也叫位时钟…

以太坊 – 部署智能合约到Ganache

目录 1. Ganache本地区块链 1.1 主界面 1.2 设置 2. 开发智能合约 2.1 初始化项目 2.2 添加package.json文件 2.3 添加智能合约源文件 2.4 编译项目 3. 部署智能合约到Ganache 3.1 更新配置文件 3.2 创建迁移脚本 3.3 执行迁移命令 1. Ganache本地区块链 首先启动…

springboot配置Swagger3.0

springboot配置Swagger3.0 1、pom加入依赖 我们创建一个SpringBoot项目&#xff0c;引入 swagger3 依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>…

任正非:ChatGPT对我们的机会是什么,内部讲话实录!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 为感谢全国火花奖获奖者对于产业界及科学界做出的重大贡献&#xff0c;华为组织了与部分获奖老师与专家的座谈会。座谈会上&…

LeetCode.46. 全排列(回溯法入门)

写在前面&#xff1a; 题目链接&#xff1a;LeetCode.46. 全排列 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a…

【震撼GPT-4崛起!年薪60万工作被GPT-4取代,成本仅2千多,引发轰动!】

目录 福利&#xff1a;文末纯分享中文版CHAT GPT镜像&#xff0c;不存在魔法&#xff0c;纯分享免费使用 一、前言 1、GPT-4的表现&#xff0c;与一位6年工作经验的人类相当 2、GPT-4完成所有类型的任务都要比人类快得多&#xff01; 二、GPT-4当数据分析师&#xff0c;都…

聊一聊影响LCD屏背光效率的几个重要因素

前阶段&#xff0c;小白的一个朋友参加了一个面试。面试完和小白说到其技术面过程惨不忍睹。被提及原因时&#xff0c;主要还是因为面试者提出的问题&#xff0c;小白的朋友答复的可能不是很让面试官满意。出于好奇&#xff0c;小白问了问都存在哪些问题&#xff0c;其中一道便…

论文笔记:Graph neural networks: A review of methods and applications

1 GNN的设计pipeline 1.1 获取图结构 结构化场景 图结构在应用问题中是已知的 比如分子结构、物理系统非结构化场景 图结构在应用问题中是未知的 需要根据任务人为地建图 1.2 判断图的类型 & 尺寸 图的类型 有向图/无向图//异构图/同构图 图中的点和边类型是不是一样的…

Prometheus 简单介绍,部署

目录 Prometheus 介绍 功能介绍 Prometheus安装 安装介绍 prometheus.yml 文件介绍 prometheus实施安装 Prometheus常用命令参数有哪些 设置Prometheus-server开机自动启动 &#xff08;解释&#xff09; Prometheus简单启动页面介绍 node_exporte 是做什么的 安装n…

【个人笔记】真寻bot部署记录+远程postgreSQL访问+源码食用记录

安装 0. 系统配置 Centos v8.2 1. 安装 使用真寻bot https://github.com/zhenxun-org/zhenxun_bot-deploy bash <(curl -s -L https://raw.githubusercontent.com/zhenxun-org/zhenxun_bot-deploy/master/install.sh)选择1&#xff0c;安装go-cqhttp和zhenxun_bot&…

java boot项目读取yml配置信息

之前 我们讲过 boot的配置文件格式主要有三种 application.properties application.yml application.yaml 我们说推荐用 application.yml 其实从 xml 到 yml 都是要系统去读取他的配置信息 今天 我们就来写一下 在java中读取 yml的配置 这里 我在 yml中多加两个配置 代码如下…

LabView中顺序结构的使用

LabView中的顺序结构能够保证程序按照一定的顺序运行。LabView中的顺序结构分为平铺式顺序结构和层叠式顺序结构两种。 1 平铺式顺序结构 平铺式顺序结构包括一个或多个顺序执行的子程序框图&#xff0c;这种框图也被成为“帧”&#xff0c;程序按照帧为单位&#xff0c;以从…

MKS SERVO4257D 闭环步进电机_系列3 串口(RS485)指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

ATA-3000系列功率放大器在精密微流体控制中的典型应用

ATA-3000系列功率放大器在精密微流体控制中的典型应用 压电陶瓷精密微流体控制应用&#xff1a; 精密微流体控制在医药配比、遗传基因与生物工程、航空航天、军工国防等方面具有广泛的应用&#xff0c;特别是在大流量伺服阀先导控制领域&#xff0c;具有重要作用。随着压电陶瓷…