C++入门篇11 模板进阶

一、非类型模板参数

模板参数分为类型形参和非类型形参

  • 类型形参:出现在模板参数列表里,跟在class/typename之后的参数类型名称
  • 非类型参数:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将参数当作常量来使用
template <class T,size_t N = 100>
class A
{
public:A():_size(0){}//...
private:T _a[N];int _size;
};

上面就是一个简单的静态数组的类,N就是一个非类型模板参数

注意:1.浮点数、类对象以及字符串是不允许作为非类型模板参数的 

2.非类型的模板参数必须在编译期就能确认结果

二、模板的特化

概念:在原模版的基础上,针对特殊类型所进行特殊化的实现方式,模板的特化分为函数模板特化和类模板特化

1.函数模拟板的特化

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参列表必须和模板函数的基础参数类型完全相同
template<class T>
bool Less(T a, T b)
{cout << "Less(T a, T b)" << endl;return a < b;
}template<>
bool Less<int*> (int* a, int* b)
{cout << "Less<int*>(int* a, int* b)" << endl;return *a < *b;
}//建议直接写出具体函数
/*bool Less(int* a, int* b)
{cout << "Less(int* a, int* b)" << endl;return *a < *b;
}*/int main()
{int a = 10, b = 20;cout << Less(a, b) << endl;cout << Less(&a, &b) << endl;return 0;
}
注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数数直接给出,不建议使用函数模板特化

 2.模板特化

2.1全特化----将模板参数列表中所有的参数都确定化

template <class T1,class T2>
class A
{
public:A(){cout << "class A" << endl;}
private:T1 x;T2 y;
};//全特化
template <>
class A<int,char>
{
public:A(){cout << "class A<int,char>" << endl;}
private:int x;char y;
};

2.2偏特化

偏特化:任何针对模板参数进一步进行条件限制设计的特化版本,分为部分特化和参数的进一步限制两种表现形式

2.2.1部分特化---将模板参数列表种的一部分参数特化
//以上面的模板为基础的部分特化
template <class T>
class A<T, char>
{
public:A(){cout << "class A<T, char>" << endl;}
private:T x;char y;
};
2.2.2参数的更进一步的限制
template <class T1,class T2>
class A<T1*, T2*>
{
public:A(){cout << "class A<T1*, T2*>" << endl;}
private:T1* x;T2* y;
};

测试样例---大家可以猜一下下面的对象分别用的是哪个模板实例化的

void test()
{A<int*, int*>a1;A<int, char>a2;A<double, char>a3;A<double, double>a4;
}

三、模板的分离编译

1.什么是分离编译

一个程序(项目)有多个源文件共同实现,而每个源文件单独编译生成目标文件,最终将所有目标文件连接起来形成单一的可执行文件的过程成为分离编译模式

2.模板的分离编译

如上图,一般的函数像上面这样写没有啥问题,但是模板这样写就会出错,为什么呢???因为代码在被编译成可执行程序的过程中,会生成符号表,这里面会有函数和函数地址,当调用函数的时候,就会在里面查找,而模板函数在被实例化之前是没有地址的,也就是不会进入符号表,所以当执行程序的时候,找不到该函数,故报错

(解释一下为什么函数模板没有被实例化,因为每个源文件都是单独编译的,在编译test.cpp文件的时候,由于有头文件的声明,Swap函数被认为是在其他文件中,只要在最终生成的符号表中查找就行,而swap.cpp文件中写的函数模板在等待被实例化,所以不会进入符号表)

所以解决方案有两种,如下

1.在模板定义的地方显示实例化(不推荐,只能一个类型一个类型的实例化),如下图

2.将声明和定义写在一起都放在.h中(或.hpp中,就是.h+.cpp文件结合的意思,和.h文件本质一样)

两种方法本质都是为了让函数模板能够成功实例化

类模板的分离编译同函数模板,这里就不多说了

四、模板的总结

【优点】
1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
2. 增强了代码的灵活性
【缺陷】
1. 模板会导致代码膨胀问题,也会导致编译时间变长
2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

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

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

相关文章

IDEA中SpringBoot的启动类文件变成了一个J文件的解决方案

错误如下&#xff1a; 解决方案&#xff1a; 此时可以发现已经恢复成功了

同源策略和跨域问题

1.跨域问题产生的原因 浏览器的同源策略影响&#xff0c;同源策略是一种安全机制&#xff0c;它限制了一个网页中的脚本只能访问同源的资源。 跨源网络访问的三种方式&#xff1a;跨域写操作&#xff0c;跨域资源嵌入&#xff0c;跨域读操作 2.跨域问题案例 ip和域名不一致…

C++教程(2)

C 环境设置 本地环境设置 如果您想要设置 C 语言环境&#xff0c;您需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。 文本编辑器 这将用于输入您的程序。文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。 文…

MATLAB——线性神经网络预测程序

微❤关注“电击小子程高兴的MATLAB小屋”获得资料&#xff08;专享优惠&#xff09; %% 学习目标&#xff1a; 线性神经网络 %% 收敛速度和精度比之前讲的感知器神经网络要高&#xff0c; %% 主要应用在函数逼近&#xff0c;信号预测&#xff0c;模式识别&#xff0c;系统辨…

【基于windows desktop上的docker配置nacos,并采用宿主机访问】

1、拉取镜像&#xff08;以下命令全部基于powershell&#xff09; docker pull nacos/nacos-server2、启动容器 docker run -d -e PREFER_HOST_MODEhostname -e MODEstandalone -e JVM_XMS256m -e JVM_XMX256m -e JVM_XMN128m -p 8848:8848 --name nacos --restartalways nac…

STM32单片机入门学习(五)-按钮控制LED

按钮和LED接线 LED负极接B12,正极接VCC 按钮一端接B13,一端接GND&#xff0c;按下为低电平&#xff0c;松开为高电平 如图&#xff1a; 主程序代码&#xff1a;main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …

ONNX推理流程

文章目录 python版API推理流程 python版API推理流程 使用netron工具查看onnx网络结构 如下图&#xff0c;可以看出此次要使用的网络输入为&#xff1a; 输入名称&#xff1a;input输入形状&#xff1a;[1, 3, 256, 256]输入数据类型&#xff1a;float32 网络的输出为&#xff1…

通讯网关软件020——利用CommGate X2Mysql实现Modbus TCP数据转储Mysql

本文介绍利用CommGate X2MYSQL实现从Modbus TCP设备读取数据并转储至MYSQL数据库。CommGate X2MYSQL是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从Modbus TCP设备读取数据并转储至M…

Vue项目 -- 解决Eslint导致的console报错问题

在利用vue-cli3构建的项目中引入eslint进行语法检查时&#xff0c;使用console.log(‘xxx’)时&#xff0c;控制台抛出了Unexpected console statement (no-console) 异常&#xff0c; 例&#xff1a;一使用console就提示报错 解决办法是&#xff1a; 在 .eslintrc.js 文件中…

Qt事件系统 day7

Qt事件系统 day7 事件系统 在Qt中&#xff0c;事件是派生自抽象QEvent类的对象&#xff0c;它表示应用程序内发生的事情或应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理&#xff0c;但它们与小部件尤其相关。Qt程序需要在main()函数创建一个…

vue绑定style和class 对象写法

适用于&#xff1a;要绑定多个样式&#xff0c;个数确定&#xff0c;名字也确定&#xff0c;但不确定用不用。 绑定 class 样式【对象写法】&#xff1a; .box{width: 100px;height: 100px; } .aqua{background-color: aqua; } .border{border: 20px solid red; } .radius{bor…

真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考

真人现在猫鼠躲猫猫游戏是种充满乐趣和挑战的团队竞技游戏。本文将从游戏规则设计、场地布置、技术实现和用户体验等方面&#xff0c;深入探讨人现在猫鼠躲猫猫游戏的搭建流程&#xff0c;并结合专业思考与深度思考&#xff0c;为游戏搭建提供全面指导。 一、游戏规则设计&…

小程序uView2.X框架upload组件上传方法总结+避坑

呈现效果: 1.1单图片上传 1.2多图片上传 前言:相信很多人写小程序会用到uView框架,总体感觉还算OK吧,只能这么说,肯定也会遇到图片视频上传,如果用到这个upload组件相信你,肯定遇到各种各样的问题,这是我个人总结的单图片和多图片上传方法. uView2.X框架:uView 2.0 - 全面兼容…

适用于音视频的弱网测试整理

一、什么是弱网环境 对于弱网的定义&#xff0c;不同的应用对弱网的定义是有一定的差别的&#xff0c;不仅要考虑各类型网络最低速率&#xff0c;还要结合业务场景和应用类型去划分。按照移动的特性来说&#xff0c;一般应用低于2G速率的都属于弱网&#xff0c;也可以将3G划分…

idea自动封装方法

例如 package com.utils;import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle;/*** author hrui* date 2023/10/13 13:49*/ public class DBUtils {private static ResourceBundle bund…

【Pytorch】pytorch中保存模型的三种方式

【Pytorch】pytorch中保存模型的三种方式 文章目录 【Pytorch】pytorch中保存模型的三种方式1. torch保存模型相关的api1.1 torch.save()1.2 torch.load()1.3 torch.nn.Module.load_state_dict()1.4 什么是state_dict()1.4. 1 举个例子 2. pytorch模型文件后缀3. 存储整个模型3…

Netty深入浅出Java网络编程学习笔记(二) Netty进阶应用篇

目录 四、应用 1、粘包与半包 现象分析 粘包 半包 本质 解决方案 短链接 定长解码器 行解码器 长度字段解码器——LTC 2、协议设计与解析 协议的作用 Redis协议 HTTP协议 自定义协议 组成要素 编码器与解码器 编写测试类 Sharable注解 自定义编解码器能否使用Sharable注解 3、在…

科技为饮食带来创新,看AI如何打造智能营养时代

在当今社会&#xff0c;快节奏的生活方式、便捷的食品选择以及现代科技的快速发展正深刻地重塑着我们对健康的认知和实践&#xff0c;它已经不再仅仅是一个话题&#xff0c;而是一个备受关注的社会焦点。在这个纷繁复杂的交汇点上&#xff0c;AI技术的介入为我们开辟了前所未有…

【Rust笔记】浅聊 Rust 程序内存布局

浅聊Rust程序内存布局 内存布局看似是底层和距离应用程序开发比较遥远的概念集合&#xff0c;但其对前端应用的功能实现颇具现实意义。从WASM业务模块至Nodejs N-API插件&#xff0c;无处不涉及到FFI跨语言互操作。甚至&#xff0c;做个文本数据的字符集转换也得FFI调用操作系统…

云原生网关可观测性综合实践

作者&#xff1a;钰诚 可观测性 可观测性&#xff08;Observability&#xff09;是指系统、应用程序或服务的运行状态、性能和行为能够被有效地监测、理解和调试的能力。 随着系统架构从单体架构到集群架构再到微服务架构的演进&#xff0c;业务越来越庞大&#xff0c;也越来…