模板(模板函数+模板类)

模板(模板函数+模板类)

  • 1.模板
    • 1.1 模板出现的原因
    • 1.2 函数模板
      • 模板函数的定义
      • 模板函数的使用方法
      • 总结
    • 1.2 类模板
      • 使用举例

1.模板

1.1 模板出现的原因

  1. 为了代码重用;
  2. 使重用的代码不受数据类型的限制

把数据类型设计为一个参数,即参数化(parameterize) 程序设计。
软件模块由模板(template) 构造。包括函数模板(function template)和类模板(class template)。

1.2 函数模板

函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。

模板函数的定义

template<模板参数表>
函数返回类型 函数名(形参列表)
{函数体;
}

注意

  1. 模板参数表可以有多个,用逗号分开,但是不能为空
  2. 模板类型参数(template type parameter)代表一种类型,由关键字 class 或 typename)后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。

模板函数的使用方法

#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>using namespace std;template<typename Type>void Print(vector<Type>& vec)
{cout<<typeid(Type).name()<<"---->";for(int i = 0;i < vec.size();i++){cout<<vec[i]<<" ";}cout<<endl;
}int main(void)
{vector<int> vet{1,2,3,4,5};vector<char> vec{'a','b','c','d','e'};vector<float> vef{1.1,2.1,3.1,4.1,5.1};Print(vet);Print(vec);Print(vef);return 0;
}

在这里插入图片描述

总结

函数模板根据一组实际类型构造出独立函数的过程通常是隐式发生的,称为模板实参推演(template
argument deduction)。
为了判断模板实参的实际类型,编译器需检查函数调用中提供的函数实参的类型。ia 的类型为 int 数组,dx的类型为 double 数组。都被用来决定每个实例的模板参数。该过程称为模板实参推演在编译 main0函数中,由编译函数模板(functron template) 而生成的函数,称为模板函数(templatefunction)。这两个概念须分清楚

1.2 类模板

类模板定义如下:

模板定义如下
template<类型模板或参数表> 
class 类名{
...... //类声明体
}; 
template<模板参数表>
返回类型 类名<类型模板或参数表>::成员函数名 1(形参表){
//成员函数定义体
}
template<模板参数表>
返回类型 类名<类型模板或参数表>:成员函数名 n(形参表)......; //成员函数n 
{定义体n
}

模板参数有两种:模板类型参数和模板非类型参数
从通用的类模板定义中生成类的过程称为模板实例化 (template nstantiation)
其格式为:类名<类模板实在参数表>对象名

使用举例

#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>using namespace std;template<typename Type>class SqStack
{
private:Type* data;int capacity;int pos;
public:SqStack(int sz = 10){data = new Type[sz];capacity = sz;pos = -1;cout<<typeid(Type).name()<<endl;}~SqStack(){delete []data;}
};int main(void)
{SqStack<int> ist;SqStack<double> dst;return 0;
}

在这里插入图片描述

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

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

相关文章

二十三种设计模式全面解析-前言

设计模式是前辈们对代码开发经验的总结&#xff0c;用于解决常见的设计问题。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性并且经过验证和优化的解决方案。对于每个开发人员来说&#xff0c;熟悉并理解这些模式是打造高质量、…

nginx+websphere sendRedirect 端口错误

nginxwebsphere sendRedirect 端口错误 问题现象&#xff1a; nginxwebsphere 当在websphere中使用sendRedirect时&#xff0c;会将websphere的端口传递到浏览器 eg: 正确的访问地址为&#xff1a;127.0.0.1 使用sendRedirect后&#xff0c;变为127.0.0.1:9080 解决办法&…

一键同步,无处不在的书签体验:探索多电脑Chrome书签同步插件

说在前面 平时大家都是怎么管理自己的浏览器书签数据的呢&#xff1f;有没有过公司和家里的电脑浏览器书签不同步的情况&#xff1f;有没有过电脑突然坏了但书签数据没有导出&#xff0c;导致书签数据丢失了&#xff1f;解决这些问题的方法有很多&#xff0c;我选择自己写个chr…

2018年亚太杯APMCM数学建模大赛B题人才与城市发展求解全过程文档及程序

2018年亚太杯APMCM数学建模大赛 B题 人才与城市发展 原题再现 招贤纳士是过去几年来许多城市的亮点之一。北京、上海、武汉、成都、西安、深圳&#xff0c;实际上都在用各种吸引人的政策来争夺人才。人才代表着城市创新发展的动力&#xff0c;因为他们能够在更短的时间内学习…

前端面试题10.23

解决的最复杂的前端问题&#xff0c;介绍一下 最复杂的前端问题之一是浏览器兼容性&#xff0c;不同浏览器对网页的渲染方式存在差异&#xff0c;需要针对不同浏览器做兼容性处理。此外&#xff0c;前端性能优化也是一个复杂的问题&#xff0c;需要综合考虑网页加载速度、渲染…

新生儿黄疸:原因、科普和注意事项

引言&#xff1a; 新生儿黄疸是许多新生儿面临的常见情况。虽然它通常是一种暂时的现象&#xff0c;但对于许多父母来说&#xff0c;这可能引发担忧。本文将科普新生儿黄疸的原因&#xff0c;提供相关信息&#xff0c;并为父母和监护人提供注意事项&#xff0c;以帮助他们更好…

使用AOP切面实现日志记录功能

系列文章 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. Java中运用BigDecimal对字符串的数值进行加减乘除等操作 5. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&…

密码学-SHA-1算法

实验七 SHA-1 一、实验目的 熟悉SHA-1算法的运行过程&#xff0c;能够使用C语言编写实现SHA-1算法程序&#xff0c;增 加对摘要函数的理解。 二、实验要求 (1)理解SHA-1轮函数的定义和工作过程。 (2)利用VC语言实现SHA- 1算法。 (3)分析SHA- 1算法运行的性能。 三、实验…

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记

0. 内容 1. 时间戳同步问题及意义 时间戳同步的原因&#xff1a;如果不同步&#xff0c;由于IMU频率高&#xff0c;可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据&#xff0c;且时间不同步会导致我们首尾camera和IMU数据时间不同&#xff0c;…

65、内网安全-域环境工作组局域网探针方案

目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击&#xff0c;直接进去&#xff0c;然后再去攻击内网&#xff0c;那么攻击的对象一…

Redis 命令 和 数据类型 您知道多少

文章目录 一、概述二、Redis 命令行客户端连接 Redis 服务器三、在 Redis 帮助命令的说明四、Redis 通用命令 generic4.1 通用命令说明4.1 keys 命令&#xff0c;列举出当前库的所有键4.2 type 命令&#xff0c;可以查看键对应值的类型4.3 object encoding 命令&#xff0c;查看…

深度学习 anaconda 安装问题

配置anaconda 在官网下载匹配版本的anaconda&#xff08;官网下载可能时间比较长&#xff09;&#xff0c;可以选择清华镜像。 安装过程默认即可&#xff0c;或者根据情况进行修改。 旧版本是可以在安装的时候勾选添加路径到环境变量中的&#xff0c;但是我安装的是2023.9月…

react 中setState 的三种写法

目录 1&#xff1a;使用对象形式的setState&#xff1a; 2&#xff1a;使用函数形式的setState: 3&#xff1a;使用回调函数&#xff1a; 1&#xff1a;使用对象形式的setState&#xff1a; this.setState({ count: 0 });2&#xff1a;使用函数形式的setState: this.setSt…

基于ResNet34的花朵分类

一.数据集准备 新建一个项目文件夹ResNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/example_i…

Qt QWebEngine 更换语言

背景 使用Qt QWebEngine开发的应用&#xff0c;在一些场景下&#xff0c;会显示英文文本&#xff0c;比如右键、JS弹出的对话框&#xff0c;所以需要进行汉化&#xff0c;更改语言。 准备翻译文件 Qt有提供翻译好的ts文件&#xff0c;我们可以直接下载ts文件qtwebengine_zh_…

深度学习——图像分类(CIFAR-10)

深度学习——图像分类&#xff08;CIFAR-10&#xff09; 文章目录 前言一、实现图像分类1.1. 获取并组织数据集1.2. 划分训练集、验证集1.3. 图像增广1.4. 引入数据集1.5. 定义模型1.6. 定义训练函数1.7. 训练模型并保存模型参数 二、生成一个桌面小程序2.1. 使用QT设计师设计界…

【Unity程序技巧】异步保险箱管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

华为eNSP配置专题-路由策略的配置

文章目录 华为eNSP配置专题-路由策略的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、配置路由策略3.1、目标3.2、配置路由策略 华为eNSP配置专题-路由策略的配置 0、概要介绍 路由策略就是通过一系列工具…

LuatOS-SOC接口文档(air780E)--lvgl - LVGL图像库

lvgl.draw_mask_radius_param_t() 创建一个lv_draw_mask_radius_param_t 参数 无 返回值 返回值类型 解释 userdata lv_draw_mask_radius_param_t指针 例子 local radius lvgl.draw_mask_radius_param_t()lvgl.draw_mask_radius_param_t_free(radius) 释放一个lv_d…

【云原生】portainer管理多个独立docker服务器

目录 一、portainer简介 二、安装Portainer 1.1 内网环境下&#xff1a; 1.1.1 方式1&#xff1a;命令行运行 1.1.2 方式2&#xff1a;通过compose-file来启动 2.1 配置本地主机&#xff08;node-1&#xff09; 3.1 配置其他主机&#xff08;被node-1管理的节点服务器&…