当前位置: 首页 > news >正文

C++: C++模板<template>

C++ template content

  • 😊前言
    • 😁模板
  • 💕1、泛型编程
  • 😍2、函数模板
    • 😒2.1:函数模板概念
    • 👌2.2:函数模板的格式
    • 😘2.3:函数模板原理
    • 😁2.4:函数模板实例化
    • 🤞2.5:模板参数的匹配原则
  • 👍3、类模板
    • 😎3.1:类模板的概念
    • 💋3.2:类模板的格式
    • 🎉3.3:类模板的实例化
  • 🌹4、非类型模板参数
  • 😃5、模板的特化
    • 🎁5.1:特化的概念
    • 👏5.2:函数模板的特化
    • 👩5.3:类模板特化
      • 🧧5.3.1:类模板全特化
      • 🥗5.3.2:类模板偏特化
  • 🥫6、模板的分离编译
    • 🚗6.1:什么是分离编译
    • 🚘6.2:分离编译解决办法
    • 💛 7、模板内嵌类型无法识别问题
    • 💗8、模板总结*

😊前言

 本文介绍模板的机制和基础语法。

😁模板

  1. 模板就是构建一个通用函数或者类的蓝图
  2. 在C++中 template被称为参数化类型(parameterized type):称其参数化是因为:类型相关的信息可自
    template定义中剥离,称其为类型:是因为每个 class template或 function template
    所接受的类型,可以由用户指定。

💕1、泛型编程

如何实现一个泛型编程

#include<iostream>
#include<string>
using namespace std;//在没有泛型编程时,只能使用函数重载逐个写
void Sweap(int& pa, int& pb)
{cout<< "交换之前:"<< pa << " "<< pb <<endl;int temp = pa;pa = pb;pb = temp;cout<< "交换之前:"<< pa << " "<< pb <<endl;
}void Sweap(double& pa, double& pb)
{double temp = pa;pa = pb;pb = temp;
}void Sweap(char& pa, char& pb)
{char temp = pa;pa = pb;pb = temp;
}int main(){int ia = 1;int ib = 2;Sweap(ia,ib);
}

显然,上述代码通过重载的方式来实现不同数据类型的交换,不仅代码的可维护性低,而且一旦需要修改交换函数逻辑,所有的重载函数均需要修改。
为此,我们引入泛型编程的概念,提高代码的复用性,而模板时泛型编程的基础
模板分为:函数模板和类模板

😍2、函数模板

😒2.1:函数模板概念

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

👌2.2:函数模板的格式

template<typename T1, typename T2…, typename T3>
函数返回类型 函数名(参数列表){ }
解析:

  1. 模板定义从template关键字开始,后面的 尖括号<>为模板参数列表
  2. 尖括号<>中的 typename关键字是模板的类型参数,可以将其看做是类型说明符
  3. 类型参数可以用来指定函数返回类型或函数参数类型
template<typename T>
void Sweap(T& pa, T& pb){T temp = pa;pa = pb;pb = temp;
}

😘2.3:函数模板原理

原理:

  1. 函数模板时一个蓝图,它本身并不是函数,是编译器使用生产方式产生特定具体类型函数的模具。
    2.所以其实模板就是将本来应该我们重复做的事情,交给了编译器。
    在这里插入图片描在述在编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
    在这里插入图片描述

😁2.4:函数模板实例化

1: 隐式实例化:让编译自己根据实参,推演模板实参的实际类型。
2:显示实例化:在函数名后加上<>, 并在<>中指定模板参数的实际类型。

🤞2.5:模板参数的匹配原则

原则1:一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以实例化为这个非函数模板
原则2:在其他条件相同情况下,在调用时会优先调用非模板函数而不会从该模板产生一个实例。
原则3:模板函数不允许自动类型转换,但是普通函数可以自动类型转换

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}void Test()
{Add(1, 2);   // 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数
}

👍3、类模板

类模板(calss template)是用来生成类的蓝图(模子)的

😎3.1:类模板的概念

1:与函数模板不同的是:类模板不能隐式地推断模板类型参数的类型
2:实例化时需要显示指定模板参数类型

💋3.2:类模板的格式

template<typename T1, typename T2…, typename Tn>
class 类名 { }

> 原型:
>     template<typename T>
>     class A
>     {
>      public:
>              A(T a):_a(a) {  }
>      private:
>            T _a;
>     }

🎉3.3:类模板的实例化

举例:1: 设计一个Vector ,它装的元素是 T2:先push_back四个元素,然后打印这四个元素3:这里用到了:类模板实例化时显示的将特定类型绑定到模板参数列表中----这个是和模板函数的区别,模板函数可以隐式转换还用到了在类外定义成员函数,必须加上类模板的参数列表获取指针 T* data的值,可以直接 data[i] 这样使用// ---------类模板-------------
template <typename T>
class Vector
{
public:Vector(size_t _capacity = 10):_pData(new T[_capacity]),_size(0),_capacity(_capacity){}// 析构函数,在类外定义~Vector();void PushBack(const T& data);void printfVec(T* datas);T* _pData;
private:size_t _size;size_t _capacity;
};
// 类模板成员函数在类外定义时:必须加上类模板的参数列表
template<typename T>
Vector<T>::~Vector()
{if(_pData) delete[] _pData;_size = 0;_capacity = 0;
}template<typename T>
void Vector<T>::printfVec(T* datas)
{for(int i = 0;i<_size;i++){// 指针datas[i] 其实已经做了提领的操作cout<< datas[i]<< " ";}cout << endl;
}template<typename T>
void Vector<T>::PushBack(const T& data){if(_size == _capacity){T* p = new T[_capacity*2];for(int i = 0; i<_size;i++){p[i] = _pData[i];}_pData = p;_capacity *=2;}_pData[_size] = data;++_size;
}int main(){// 模板实例化,需要显示的指定typenameVector<int> V1(1);V1.PushBack(1);V1.PushBack(2);V1.PushBack(3);V1.PushBack(4);V1.printfVec(V1._pData);
}

🌹4、非类型模板参数

概念
模板类型参数分为两种:类型参数和非类型参数(常量值)
类型参数:
出现在模板参数列表中,<>中存在class或typename的参数类型名称
非类型参数:
使用一个常量作为类(函数)模板的某个参数,在类(函数)模板中可将该参数当做初常量来使用。
1: 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2:非类型的模板参数必须在编译期就能确定结果。

namespace Array
{
// 模板参数列表中指定了类型,还可以给定“缺省值”
template<class T,size_t N=10>
class array
{
public:T& operator[](size_t index){ return _array[index]; }size_t size()const{return _size;}bool empty()const {return 0==_size; }
private:T _array[N];size_t _size;
};
}void printf_arr(){// 非类型模板参数,必须使用常量/表达式(右值)进行传参Array::array<int,5> arr;for(int i = 0; i<5; i++){arr[i] = 1;}
}
int main(){printf_arr();
}

😃5、模板的特化

🎁5.1:特化的概念

通常情况下:使用模板可以实现一些 与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,那么这些类型就需要特殊处理。
特化分为:函数模板特化和类模板特化。

👏5.2:函数模板的特化

struct Date
{int _year = 1;int _month = 1;int _day = 1;
};template<class T>
bool ISEqual(T left, T right)
{return left == right;
}// 函数模板特化(针对某些类型的特殊化处理)
bool ISEqual(Date* left, Date* right)
{return left->_year == right->_year&& left->_month == right->_month&& left->_day == right->_day;
}int main(){//int ia = 1;// int ib = 2;//Sweap(ia,ib);// 模板实例化,需要显示的指定typename// Vector<int> V1(1);// V1.PushBack(1);// V1.PushBack(2);// V1.PushBack(3);// V1.PushBack(4);// V1.printfVec(V1._pData);// printf_arr();cout << ISEqual(1,3)<< endl;// 如果没有特化函数模板,那么比较的就是指针(比较地址),那这样是无意义的struct Date date1;date1._year = 2022;date1._month = 3;date1._day = 4;struct Date date2;date2._year = 2022;date2._month = 3;date2._day = 4;cout<< ISEqual(&date1,&date2)<< endl;}

👩5.3:类模板特化

🧧5.3.1:类模板全特化

🥗5.3.2:类模板偏特化

🥫6、模板的分离编译

🚗6.1:什么是分离编译

🚘6.2:分离编译解决办法

💛 7、模板内嵌类型无法识别问题

💗8、模板总结*

相关文章:

C++: C++模板<template>

C template content&#x1f60a;前言&#x1f601;模板&#x1f495;1、泛型编程&#x1f60d;2、函数模板&#x1f612;2.1&#xff1a;函数模板概念&#x1f44c;2.2&#xff1a;函数模板的格式&#x1f618;2.3&#xff1a;函数模板原理&#x1f601;2.4&#xff1a;函数模…...

chmod命令详解

用法&#xff1a;chmod [选项]… 模式[,模式]… 文件…  或&#xff1a;chmod [选项]… 八进制模式 文件…  或&#xff1a;chmod [选项]… --reference参考文件 文件… Change the mode of each FILE to MODE. With --reference, change the mode of each FILE to that of R…...

状态机设计中的关键技术

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…...

单片机开发---ESP32S3移植NES模拟器(二)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器&#xff08;一&#xff09;》 暖场视频&#xff0c;小时候称这个为—超级曲线射门&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…...

微信小程序nodej‘s+vue警局便民服务管理系统

本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括“最多跑一次”微信小程序的网络应用,在外国小程序的使用已经是很普遍的方…...

第18章 MongoDB $type 操作符教程

MongoDB $type 操作符 描述 在本章节中&#xff0c;咱们将继续讨论MongoDB中条件操作符 $type。 $type操作符是基于BSON类型来检索集合中匹配的数据类型&#xff0c;并return 结果。 MongoDB 中可以使用的类型如下表所示&#xff1a; 类型数字备注Double1 String2 Object3…...

【MySQL主从复制】快速配置

本文配置环境Windows和Linux。 windows主 Linux 从 一、主库配置 首先保证Linux和防火墙开启3306端口或关闭防火墙。 登录Mysql管理员账户: GRANT REPLICATION slave,reload,super ON *.* TO root@从库ip地址 IDENtIFIED BY root; flush privileges; 本地的mysql可以被:…...

Typescript - interface 关键字(通俗易懂的详细教程)

前言 简单来说&#xff0c;Interface 就是一种描述对象或函数的东西。 您可以把 interface 理解为形状&#xff0c;真实开发情况下&#xff0c;一个对象需要有什么样的属性&#xff0c;函数需要什么参数或返回什么样的值&#xff0c;数组应该是什么样子的&#xff0c;一个类和继…...

【计组】内存和总线

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、虚拟内存和内存保护 日常使用的操作系统下&#xff0c;程序不能直接访问物理内存。内存需要被分成固定大小的页&#xff08;Page&#xff09;&#xff0c;再通过虚拟内存地址&#xff08;Virtu…...

CUDA中的数学方法

CUDA中的数学方法 文章目录CUDA中的数学方法1. Standard FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions2. Intrinsic FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions参考手册…...

Elasticsearch基本概念和索引原理

一、Elasticsearch是什么&#xff1f; Elasticsearch是一个基于文档的NoSQL数据库&#xff0c;是一个分布式、RESTful风格的搜索和数据分析引擎&#xff0c;同时也是Elastic Stack的核心&#xff0c;集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统&…...

《NFL橄榄球》:堪萨斯城酋长·橄榄1号位

堪萨斯城酋长队&#xff08;Kansas City Chiefs&#xff09;是位于密苏里州堪萨斯城的职业美式橄榄球队&#xff1b;目前在全国橄榄球联盟隶属于美国橄榄球联合会(AFC)西区&#xff1b;其夏季训练营在威斯康星大学河瀑校区举行。 酋长队的前身是达拉斯得州佬队&#xff0c;这支…...

python+django在线教学网上授课系统vue

随着科技的进步&#xff0c;互联网已经开始慢慢渗透到我们的生活和学习中&#xff0c;并且在各个领域占据着越来越重要的部分&#xff0c;很多传统的行业都将面临着巨大的挑战&#xff0c;包括学习也不例外。现在学习竞争越来越激烈&#xff0c;人才的需求量越来越大&#xff0…...

二叉搜索树之AVL树

AVL树的概念二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上…...

全栈自动化测试技术笔记(二):准备工作的切入点

自动化测试技术笔记(二)&#xff1a;准备工作的切入点 上篇整理的技术笔记&#xff0c;聊了自动化测试的前期调研工作如何开展&#xff0c;最后一部分也提到了工作的优先级区分。 这篇文章&#xff0c;接上篇文章的内容&#xff0c;来聊聊自动化测试前期的准备工作&#xff0…...

57 长短期记忆网络(LSTM)【动手学深度学习v2】

57 长短期记忆网络&#xff08;LSTM&#xff09;【动手学深度学习v2】 深度学习学习笔记 学习视频&#xff1a;https://www.bilibili.com/video/BV1JU4y1H7PC/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 长短期记忆网络&#xff08;LSTM&#xff09…...

算法第十五期——动态规划(DP)之各种背包问题

目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】 【做法】 【代码】 空间优化1&#xff1a;交替滚动 空间优化2&#xff1a;自我滚动 3、完全背包 【思路】 【代码】 4、分组背包 核心代码 5、多重背包 多重背包解题思路1:转化…...

实现复选框全选和全不选的切换

今天&#xff0c;复看了一下JS的菜鸟教程&#xff0c;发现评论里面都是精华呀&#xff01;&#xff01; 看到函数这一节&#xff0c;发现就复选框的全选和全不选功能展开了讨论。我感觉挺有意思的&#xff0c;尝试实现了一下。 1. 全选、全不选&#xff0c;两个按钮&#xff…...

React hooks之useState用法(一)

系列文章目录 学习React已经有很长的一段时间了&#xff0c;今天决定重新回顾一下跟React相关的一些知识点 文章目录系列文章目录结构如下一、hooks是什么&#xff1f;useState可以能做什么二、如何使用useState&#xff08;&#xff09;第一步&#xff1a;创建【函数组件&…...

spring的简单理解

目录 1 .ioc容器&#xff08;控制反转&#xff09; 2. Aop面向切面编程 3. 事务申明 4. 注解的方式启动 5. spring是什么与他的优势 6. 代理设计模式&#xff08;比如aop&#xff09; 7. springmvc中相应json数据 8. 使用lombok来进行对代码的简化 9. 使用logback记录…...

Docker调用Intel集显实现FFmpeg硬解码

文章目录Docker调用Intel集显实现FFmpeg硬解码参考FFmpeg 集成qsv方式一 容器完成所有步骤方式二 容器完成部分步骤方式三 dockerfile部署Docker调用Intel集显实现FFmpeg硬解码 参考 ffmpeg_qsv_docker拉取该镜像可以实现FFmpeg集成vaapi的硬加速&#xff0c;通过dockerfile文…...

端到端模型(end-to-end)与非端到端模型

一、端到端&#xff08;end to end&#xff09; 从输入端到输出端会得到一个预测结果&#xff0c;将预测结果和真实结果进行比较得到误差&#xff0c;将误差反向传播到网络的各个层之中&#xff0c;调整网络的权重和参数直到模型收敛或者达到预期的效果为止&#xff0c;中间所…...

uniApp封装一个滑块组件

最近 项目中有一个需求 PC端动态设计的表单 移动端要能渲染出来 那么 就要去找到对应的组件 而其中 没有的 就包括滑块 没有又能怎么办 只能自己封装一个 我们直接上代码 <template><view class"u-slider" tap"onClick" :class"[disabled…...

运动基元(二):贝塞尔曲线

贝塞尔曲线是我第一个深入接触并使用于路径规划的运动基元。N阶贝塞尔曲线具有很多优良的特性,例如端点性、N阶可导性、对称性、曲率连续性、凸包性、几何不变性、仿射不变性以及变差缩减性。本章主要介绍贝塞尔曲线用于运动基元时几个特别有用的特性。 一、贝塞尔曲线的定义 …...

Android 11.0 关于Launcher3中调用截图功能总是返回null的解决方案

1.1概述 在11.0的系统产品开发中,在某些时候需要调用截图接口来进行截屏功能实现,而在Launcher3中发现调用系统截屏接口SurfaceControl.screenshot进行截图的时候始终为null, 获取不到系统当前页面的截屏功能,所以需要找到当前截屏失败的原因然后来实现截屏功能的实现,下面来…...

random随机数

random随机数 1.概述 random用来生成一些随机数&#xff0c;下面介绍random模块提供的方法根据需求生成不同的随机数。 2.random常用操作 2.1.random默认随机数 random()函数返回一个随机的浮点值&#xff0c;默认返回值范围在0 < n < 1.0区间 import randomfor i …...

【金三银四系列】Spring面试题-上(2023版)

Spring面试专题 1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 有些同学可能会抢答&#xff0c;不熟悉!!! 好了&#xff0c;不开玩笑&#xff0c;面对这个问题我们应该怎么来回答呢&#xff1f;我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍…...

linux基本功系列之tar命令实战

文章目录前言一. tar命令介绍二. 语法格式及常用选项三. 参考案例3.1 仅打包不压缩3.2 打包后使用调用压缩命令进行压缩3.3 列出文件的内容3.4 追加文件到tar命令中3.5 释放文件到指定的目录四 . 各种压缩方式的比较总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓…...

Prometheus服务发现

Prometheus服务发现介绍 Prometheus默认是采用pull的方式拉取监控数据的&#xff0c;每一个被抓取的目标都要暴露一个HTTP接口&#xff0c;prometheus通过这个接口来获取相应的指标数据&#xff0c;这种方式需要由prometheus-server决定采集的目标服务器有哪些&#xff0c;通过…...

【Spring6源码・MVC】请求处理流程源码解析

上一篇《【Spring6源码・MVC】初始化registry&#xff0c;完成url和controller的映射关系》我们知道&#xff0c;在IOC容器加载的同时&#xff0c;初始化了registry这个HashMap&#xff0c;这个HashMap中存放了请求路径和对应的方法。当我们请求进来&#xff0c;会通过这个regi…...

做策划的人经常浏览的网站/seo关键词首页排名代发

小白机器学习基础算法学习必经之路作者简介&#xff1a;武博士&#xff0c;人工智能方向博士&#xff0c;中国移动集团IT架构师。 科研方向&#xff1a;自然语言处理、计算机视觉、强化学习。 已经发表SCI文章3篇。 CSDN专栏文章60篇。&#xff08;机器学习专栏、深度学习专栏、…...

怎么做自助提卡网站/怎么申请一个网站

我猜你在学Python。其他的答案是对的。但我要回答你的主要问题&#xff1a;“如何用python计算百分比” 虽然它的工作方式是你做的&#xff0c;但它看起来不是很Python。另外&#xff0c;如果你需要添加一个新的主题&#xff0c;会发生什么&#xff1f;你将不得不添加另一个变量…...

windows系统怎么做ppt下载网站/电商营销策划方案

一、JDK的安装 1.进入甲骨文&#xff08;Oracle&#xff09;官网&#xff0c;找到下载JDK的位置。 此处直接给出下载JDK的链接。 传送门 2.挑选自己需要的JDK版本&#xff0c;此处推荐JDK8与JDK11. 这里以Windows操作系统为例。如果是32位的&#xff0c;就下载X86&#xff1b;…...

乌鲁木齐做网站的公司/微信公众号推广网站

第一种方法&#xff1a;把弹框固定在底部&#xff0c;通过过渡弹框高度来实现。下面是完整demo,可复制。移动从底部向上滑动弹出.clickBtn{height: 40px;}.clickBtn button{float: right;}.willAlert{position:absolute;left:0;bottom: 0;width:100%;height: 0;overflow: hidde…...

滕州网站建设 助企网络/上海关键词优化按天计费

在系统开机后我们的桌面图标却不翼而飞了&#xff0c;这该怎么办&#xff1f;没有桌面图标就相当于我们进房间没有了门&#xff0c;就这样无路可走了吗&#xff1f;别慌&#xff0c;下文就给出了让你的桌面图标重现的方法。 右键单击桌面&#xff0c;排列桌面图标&#xff0c;显…...

wordpress文章没缩略图/培训网站推广

现在的上班族&#xff0c;都是依靠电脑在办公的&#xff0c;所以每天接收到的电子文件有很多&#xff0c;这些都跟自己的工作息息相关&#xff0c;所以一般都是需要保存在电脑里面的&#xff0c;但是电脑就真的很安全吗&#xff1f;能确保数据的安全吗&#xff1f; 其实电脑虽然…...