C++?模板(进阶)!!!

一、引言

        在之前我们已经介绍过C++中引入的非常好用的一个工具--模板,同时借助模拟实现string、vector、list等容器熟悉了如何使用模板,今天我们将要一起学习有关模板的进阶知识,如果还想了解模板的概念以及基础的使用可以跳转到以下链接:

        C++?模板!!!_template vector & vector ::func(co-CSDN博客 https://blog.csdn.net/2501_90507065/article/details/147571025?spm=1001.2014.3001.5501

二、非类型模板参数

        1、引入

        在平常的使用情景中,我们会遇到类似在类中定义静态数组的情况,这时候就会存在静态定义数组最常见的问题:空间开少了不够用,开多了用不完。这时候我们常会用‘#define’来解决,但是这种处理方法也只是治标不治本,仍然是写死的,不能让用户很好的控制数组空间的大小,该怎么办呢?这时候就可以使用我们接下来要提到的非类型模板参数

        2、什么是非类型模板参数?


        我们常用的模板参数一般都是类型形参,跟在class或者typename之后,这样可以很好的解决由于类型不同但内容相同的类需要写很多份的问题;而非类型模板参数就是用一个常量作为类(函数)模板的参数,在模板中可以将这个参数当成常量来使用,借助它我们就可以解决上面的问题:

        

#include <iostream>
using namespace std;
template<class T , int N>
class A
{
private:T arr[N];
};
void test1()
{A<int, 10> a;
}
int main()
{test1();return 0;
}

三、函数模板的特化

        1、引入

        当完成一个函数模板时,我们有时候并不是期望当传入所有参数类型时都进行相同的操作,比如:当一个用于比较的函数,当传入指针类型时我们可能更希望对它们解引用之后的内容进行比较,这时候我们就需要对该函数进行特化了

        2、函数模板的特化

        我们解决上面的问题,我们引入了函数模板的特化,语法如下:
        

//template<>//为了说明这是一个函数模板
//返回值需要与对应的函数模板相同   //函数名<预计传入的类型> //参数列表
//函数体

         在函数模板的特化时,我们需要注意以下几个点:
                  (1). 必须要先有一个基础的函数模板

                  (2). 关键字template后面接一对空的尖括号<>

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

                  (4). 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误

        下面的代码是一个实际的应用,解决在“引入”部分提出的问题:
        

template<class T>
bool Less(T t1, T t2)
{return t1 < t2;
}
template<>
bool Less<int*>(int* t1, int* t2)
{return *t1 < *t2;
}

        除了上面提到的函数模板特化之外,还支持了部分特化,所以上面的函数模板还支持这样定义:

        

template<class T1,class T2>
bool Less(T1 t1, T2 t2)
{return t1 < t2;
}
template<class T1>
bool Less<T1,int*>(T1 t1, int* t2)
{return t1 < *t2;
}

        这段代码的意思是:当第二个参数是int*类型时,就采取第二种比较方法,虽然一般不会有这样的情况出现,但是我们主要是为了说明这样一个语法点

四、类模板的特化

        类模板的特化是为了解决类似函数模板特化想解决的问题的,同时类模板也分为全特化与偏特化,接下来我们一个一个的解释

        1、全特化

        全特化是指将类模板参数列表中所有的参数都进行特殊化处理,我们使用一个简单的日期类来进行演示:
        

template<class T1,class T2>
class Date
{
public://成员函数列表
private:T1 _d1;T2 _d2;
};
template<>
class Date<int, char>
{
public://成员函数列表
private:int _d1;char _d2;
};

        可以看出,类模板的特化与函数模板的特化是很相似的,我们仍然需要在类名之后对特化的参数进行写明

        2、偏特化

                (1).部分特化

                部分特化是指将一部分的类模板参数进行特殊化处理:
                

template<class T1>
class Date<T1, int>
{
public://成员函数列表
private:T1 _d1;int _d2;
};
                (2).对参数进行更进一步的限制

                我们可以对于某些参数进行一些限制,达到特殊化处理模板参数的目的,下面是将参数特化为指针类型:
                

template<class T1,class T2>
class Date<T1*, T2*>
{
public://成员函数列表
private:T1 _d1;T2 _d2;
};

                自然的,我们还可以将参数特化为引用类型,这里就不做演示了

五、结语

        这就是本期有关模板进阶全部的内容了,期待各位于晏、亦菲与我一起交流、学习、进步!
        

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

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

相关文章

《量子计算实战》PDF下载

内容简介 在加密、科学建模、制造物流、金融建模和人工智能等领域&#xff0c;量子计算可以极大提升解决问题的效率。量子系统正变得越来越强大&#xff0c;逐渐可用于生产环境。本书介绍了量子计算的思路与应用&#xff0c;在简要说明与量子相关的科学原理之后&#xff0c;指…

Vue3前后端分离用户信息显示方案

在Vue3前后端分离的项目中&#xff0c;若后端仅返回用户ID&#xff0c;可通过以下步骤显示用户名&#xff1a; 解决方案 获取用户信息API 确保后端提供以下任意一种接口&#xff1a; 批量查询接口&#xff1a;传入多个用户ID&#xff0c;返回对应的用户信息列表 单个查询接口…

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例 在现代工业自动化控制系统中&#xff0c;艾默生流量计因其高精度、稳定性和易用性而备受青睐。然而&#xff0c;为了实现与不同协议设备之间的无缝通信&#xff0c;经常需要借助专业的通讯网关进行协议转换。本文将…

SQL优化学习笔记

SQL优化 insert优化 常规优化思路 每次插入数据时都需要和数据库建立连接、关闭连接&#xff0c;因此批量插入会大量节省IO避免浪费。&#xff08;每次500-1000条&#xff09;开启手动提交事务&#xff08;start transaction … commit&#xff09;主键顺序插入&#xff1a;…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Hidden Search Widget 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…

【NGINX】 -10 keepalived + nginx + httpd 实现的双机热备+ 负载均衡

文章目录 1、主架构图1.1 IP地址规划 2、web服务器操作3、配置nginx服务器的负载均衡4、配置keepalived4.1 master4.1 backup 5、测试双机热备5.1 两台keepalived服务器均开启5.2 模拟master节点故障 1、主架构图 1.1 IP地址规划 服务器IP地址web1192.168.107.193web2192.168.…

SQL 多表关联与分组聚合:解密答题正确率分析

一、问题拆解&#xff1a;从业务需求到SQL逻辑 1.1 需求分析 题目要求&#xff1a;计算浙江大学用户在不同难度题目下的答题正确率&#xff0c;并按正确率升序排序。 关键分析点&#xff1a; 数据来源&#xff1a; user_profile&#xff1a;存储用户信息&#xff08;大学&a…

VS Code启动Git导致大量磁盘读写 - 解决方案

问题 通过VS Code打开项目后&#xff0c;若项目使用了Git&#xff0c;且文件数目较多&#xff0c;则VS Code会自动在后台调用Git检查项目修改&#xff0c;会造成大量磁盘读写&#xff0c;严重影响电脑性能。 解决方案 在VS Code设置中关闭Git功能&#xff0c;在终端中使用Gi…

Vue3 与 Vue2 区别

一、Vue3 与 Vue2 区别 对于生命周期来说&#xff0c;整体上变化不大&#xff0c;只是大部分生命周期钩子名称上 “on”&#xff0c;功能上是类似的。不过有一点需要注意&#xff0c;组合式API的Vue3 中使用生命周期钩子时需要先引入&#xff0c;而 Vue2 在选项API中可以直接…

网络安全之身份验证绕过漏洞

漏洞简介 CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件&#xff0c;支持FTP、SFTP、HTTP、WebDAV等多种协议&#xff0c;为企业和个人用户提供安全文件传输服务。近期&#xff0c;一个被编号为CVE-2025-2825的严重安全漏洞被发现&#xff0c;该漏洞影响版本1…

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者&#xff0c;体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型&#xff0c;体验其使用。 Word2Vec模型 …

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…

Nginx网站功能

一.基于授权的访问控制 1.基于授权的访问控制简介 Nginx与Apahce 一样&#xff0c;可以实现基于用户授权的访问控制&#xff0c;当客户端想要访问相应网站或者目录时&#xff0c;要求用户输入用户名和密码才能正常访问&#xff0c;配置步骤与Apache基本一致。 2.基于授权的访…

海外盲盒系统开发:重构全球消费体验的科技引擎

当盲盒文化席卷全球&#xff0c;海外盲盒系统开发已成为重构消费体验的核心赛道。数据显示&#xff0c;2025年全球盲盒市场规模突破120亿&#xff0c;东南亚市场年增长率达4540。我们开发的海外盲盒系统&#xff0c;以技术创新为驱动&#xff0c;打造覆盖全链路的全球化解决方案…

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…

C 语言学习笔记(指针1)

内容提要 函数 变量的作用域变量的生命周期 指针 预备知识变量指针与指针变量 函数 变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&a…

【Linux】第二十二章 访问网络附加内存

1. NFS的主要功能是什么&#xff1f; NFS是由Linux、UNIX及类似操作系统使用的互联网标准协议&#xff0c;主要功能就是提供网络文件共享&#xff0c;允许不同的计算机系统之间通过网络共享文件&#xff0c;它使得网络上的计算机能够像访问本地文件系统一样访问远程计算机上的…

大模型时代,Python 近红外光谱与 Transformer 模型:学习的必要性探究

在当下大语言模型盛行的时代&#xff0c;各类新技术如潮水般不断涌现&#xff0c;让人应接不暇。身处这样的浪潮之中&#xff0c;不少人心中都会泛起疑问&#xff1a;Python 近红外光谱和 Transformer 模型还有学习的必要性吗&#xff1f;今天&#xff0c;就让我们深入探讨一番…