【高级程序设计语言C++】初识模板

news2024/11/22 9:45:21

  • 1. 函数模板
    • 1.1函数模板的实例化
    • 1.2显示实例化
    • 1.3模板参数的匹配原则
  • 2.类模板
    • 2.1类模板的定义格式
    • 2.2类模板的实例化

1. 函数模板

概念:

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

具体格式:

template<typename T1, typename T2,…,typename Tn>

返回值类型 函数名(参数列表){}

#include <iostream>
using namespace std;
template <class T>
void func(T& num) {
	cout << num << endl;
}
int main() {
	int a = 1;
	double b = 1.2;
	string c = "1.3";
	func(a);
	func(b);
	func(c);
	return 0;
}

输出结果:

img

typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模

板就是将本来应该我们做的重复的事情交给了编译器。

1.1函数模板的实例化

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add(b1, b2);

	//编译错误
	add(a1, b1);
	return 0;
}

img

上面模板参数列表中只有一个T,编译器无法确定到底将T确定为int还是double类型,所以报错。

有两种处理方法,一是用户自己强制转化类型,二是使用显示实例化

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add(b1, b2);
	add(a1, (int)b1);
	return 0;
}

输出结果:

img

1.2显示实例化

显示实例化就是在函数名后的<>中指定模板参数的实际类型。

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add<int>(a1, b2);
	return 0;
}

输出结果:

img

要是类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

1.3模板参数的匹配原则

  1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
void add(int a, int b) {
	cout << a + b << endl;
}
template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add<int>(a1, a2);
	return 0;
}
  1. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
void add(int a, int b) {
	cout << a + b << endl;
}
template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add<int>(a1, b1);
	return 0;
}
  1. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

2.类模板

2.1类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};

2.2类模板的实例化

类模板实例化与函数模板实例化不同,也就是说类模板实例化不支持隐式实例化,**类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,**类模板名字不是真正的类,而实例化的结果才是真正的类。

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

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

相关文章

字符串模式匹配算法(暴力破解、KMP、BM、Sunday)

目录 暴力破解 KMP 算法 构造 next 数组 KMP代码 BM 算法 Sunday 算法 参考资料 又通过leetcode复习了之前的知识:找出字符串中第一个匹配项的下标 暴力破解 你的面前有两段序列 S 和 T&#xff0c;你需要判断 T 是否可以匹配成为 S 的子串。 你可能会凭肉眼立即得出结…

11万字智慧环卫管理平台综合解决方案2023

导读&#xff1a;原文《11万字智慧环卫管理平台综合解决方案word2023》word&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 第1章 项目概述 1.1 项目名称 …

Java安全——SSL和HTTPS

Java安全 SSL和HTTPS SSL提供了在TCP套接字之上的对数据进行加密的方法&#xff0c;也是HTTPS协议的基础利用JSSE(java安全套接字扩展包)可以像处理协议一样创建和使用SSL套接字&#xff0c;从而支持HTTPS协议SSL和tcp套接字之间的紧密关系&#xff0c;本身并不是一个加密引擎…

PyTorch预训练和微调:以VGG16为例

文章目录 预训练和微调代码测试结果参考来源 预训练和微调代码 数据集&#xff1a;CIFAR10 CIFAR-10数据集由10类32x32的彩色图片组成&#xff0c;一共包含60000张图片&#xff0c;每一类包含6000图片。其中50000张图片作为训练集&#xff0c;10000张图片作为测试集。数据集介…

16. 替换空格

链接&#xff1a; 链接 题目&#xff1a; 请实现一个函数&#xff0c;把字符串中的每个空格替换成"%20"。 数据范围 0≤0≤ 输入字符串的长度 ≤1000≤1000。 注意输出字符串的长度可能大于 10001000。 样例 输入&#xff1a;"We are happy."输出&#xff…

python简易版的飞机大战(图片资源请自找)

# 引入pygame工具包 import pygame from pygame.locals import * import time import random import sys # 初始化pygame pygame.init() # 创建一个宽480高650的一个画布canvas canvas pygame.display.set_mode((480, 650)) # 加工图片资源 bg pygame.image.load(bg.png)# 背…

Vue3之app.config.globalProperties(定义全局变量)

使用之因 一般我们在vue开发中&#xff0c;常用的功能&#xff0c;接口等等我们都会封装起来&#xff0c;如何每次创建一个组件&#xff0c;想要使用这些封装起来的功能、接口等等都需要先引入&#xff0c;再通过层层调用才可以得到结果&#xff0c;如果我现在一遍需要调用后端…

多旋翼物流无人机节能轨迹规划(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

海外品牌推广:谷歌没收录?这些常见错误你可别犯!

你们是否曾经遇到过这样的情况&#xff1a;你在海外市场努力推广你的品牌&#xff0c;但是发现谷歌搜索结果中竟然找不到你的网站或品牌&#xff1f;别担心&#xff0c;你可能犯了一些常见的错误&#xff0c;让谷歌把你的品牌忽略掉了。让我们来看看这些错误&#xff0c;确保你…

3dsmax图纸怎么加密?

对设计行业来说&#xff0c;公司重要的设计图纸是一个企业非常重要的核心数据是命脉&#xff0c;那么具有如此重要性的3Dmax设计文件怎么才能确保文件的安全&#xff0c;避免竞争对手骗方案或者内部人员有意无意的泄密呢&#xff1f; 相信有很多老板或许都会遇到这样的问题。很…

❤️创意网页:有趣的文字冒险游戏(可以无限拓展)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

图片转pdf怎么在线转?看看这几种在线转方法

图片转pdf怎么在线转&#xff1f;图片转PDF是一个非常常见的需求&#xff0c;因为在很多情况下&#xff0c;我们需要将一些图片文件转换为PDF文件格式&#xff0c;以便于传输、打印或者共享。如果你想在线转换图片为PDF文件&#xff0c;下面就给大家推荐几种简单实用的转换方法…

Hadoop集群运行Spark应用程序

启动Spark集群 先启动hadoop,再启动Spark,具体参考链接 对Linux系统对Spark开发环境配置_Matrix70的博客-CSDN博客 运行Spark安装好以后自带的样例程序SparkPi spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 examples/jars/spark…

路径规划算法:基于蛇优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于蛇优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蛇优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

嵌入式软件测试笔记10 | 嵌入式软件测试中如何进行安全性分析?

10 | 嵌入式软件测试中如何进行安全性分析&#xff1f; 1 简介2 故障模型及后果分析&#xff08;FMEA&#xff09;2.1 三个步骤2.2 带来的结果优势2.3 FMEA分析过程2.3.1 描述系统及其功能2.3.2 识别潜在的故障模式2.3.3 故障模式对功能的影响2.3.4 风险导致后果的原因2.3.5 风…

Prompt本质解密及Evaluation实战与源码解析(三)

9.5 Evaluation for QA源码解析 如图9-4所示,我们看一下LangChain框架对问答评估的(Evaluation for QA)的源代码。 图9- 5 LangChain的evaluation qa目录 在eval_prompt.py文件里面,主要定义了三个类 PromptTemplate,它们都是用于生成题目的模板。 Gavin大咖微信:NLP_Mat…

跨端技术栈综合考察:深入剖析 UniApp、Flutter、Taro 和 React Native 的优势与限制

文章目录 &#x1f4c8;UniApp⚡概念⚡优势⚡限制 &#x1f4c8;Flutter⚡概念⚡优势⚡限制 &#x1f4c8;Taro⚡概念⚡优势⚡限制 &#x1f4c8;React Native⚡概念⚡优势⚡限制 &#x1f4c8;跨端技术栈对比附录&#xff1a;「简历必备」前后端实战项目&#xff08;推荐&…

强化学习快速复习笔记--待更新

目录 蒙特卡洛方法动态规划算法策略迭代 时序差分方法Sarsa算法Q-learning算法如何区分在线学习和离线学习DQN深度强化Q学习概念介绍代码解析 DQN改进算法Double DQN网络 蒙特卡洛方法 求解价值函数和状态价值函数&#xff0c;可以使用蒙特卡洛方法和动态规划。首先介绍一下蒙…

25-分布式事务----Seate

1、seate 官网:Seata Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 1.1、Seata术语 TC (Transaction Coordinator) - 事务协调者…

mysql 执行sql开启事务

SHOW VARIABLES LIKE autocommit;SET autocommit 0; INSERT INTO sugar.realmauctiondatum(Id, Name) VALUES (3, A); INSERT INTO sugar.realmauctiondatum(Id, Name) VALUES (1, A); COMMIT;如果没有调用COMMIT;退出session时会执行回滚