C++模板初识

文章目录

    • 一、函数模板
      • 1. 函数模板
      • 2. 函数模板、模板的特例化、非模板函数的重载关系
      • 3. 外部调用
      • 4. 模板的非类型参数
      • 5. 代码示例
    • 二、类模板

一、函数模板

1. 函数模板

  1. 模板函数:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来。

  2. 模板的实参推演 => 可以根据用户传入的实参的类型,来推导出模板类型参数的具体类型。

  3. 函数模板是不进行编译的,因为类型还不知道;
    模板的实例化 - 函数调用点进行实例化模板函数才是要被编译器所编译的。

2. 函数模板、模板的特例化、非模板函数的重载关系

不属于重载关系,属于共存关系

3. 外部调用

模板代码是不能在一个文件中定义的。在另外一个文件中使用的模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能够进行正常的实例化,产生能够被编译器编译的代码。

	// 告诉编译器,进行指定类型的模板实例化template bool compare<int>(int, int);template bool compare<double>(double, double);

所以,模板代码都是放在头文件当中的,然后在源文件当中直接进行#include包含。

4. 模板的非类型参数

必须是整数类型(整数或地址/引用都可以),都是常量,只能使用,而不能修改。

	template<typename T int SIZE>void sort(T *arr) {for(int i = 0; i < SIZE - 1; ++i)for(int j = 0; j < SIZE - 1 - i; ++j)if(arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}int arr[] = { 12, 5, 7, 89, 32, 21, 35 };const int size = sizeof(arr) / sizeof(arr[0]);sort<int, size>(arr);

5. 代码示例

#include <iostream>
using namespace std;// 函数模板 
template<typename T> // 定义一个模板参数列表
bool compare(T a, T b) {cout << "template compare" << endl;return a > b;
}// 模板特例化 - 针对compare函数模板,提供const char*类型的特例化版本
template<>
bool compare<const char*>(const char* a, const char* b) {cout << "compare<const char*>" << endl; return strcmp(a, b) > 0;
}// 非模板函数 - 普通函数
bool compare(const char* a, const char* b) {cout << "normal compare" << endl;return strcmp(a, b) > 0;
}int main() {compare<int>(10, 20);compare(100, 20);compare("100", "20");compare<const char*>("100", "20");return 0;
}

输出结果:

template compare
template compare
normal compare
compare<const char*>

二、类模板

#include <iostream>
using namespace std;// 类模板 -> 实例化 -> 模板类
template<typename T>
class SeqStack { // 模板名称 + 类型参数列表 = 类名称
public:// 构造和析构函数名不用加<T>,其它出现模板的地方都加上类型参数列表SeqStack(int size = 10): _pstack(new T[size]), _top(0), _size(size){}~SeqStack() {delete[]_pstack;_pstack = nullptr;}SeqStack(const SeqStack<T>& stack): _top(stack._top), _size(stack._size){_pstack = new T[_size];// 不要用memory进行拷贝for (int i = 0; i < _top; ++i) {_pstack[i] = stack._pstack[i];}}SeqStack<T>& operator=(const SeqStack<T>& stack) {if (this == &stack) {return *this;}delete[]_pstack;_top = stack._top;_size = stack._size;_pstack = new T[_size];// 不要用memory进行拷贝for (int i = 0; i < _top; ++i) {_pstack[i] = stack._pstack[i];}return *this;}//void push(const T& val) { // 类外实现//	if (full())//		expand();//	_pstack[_top++] = val;//}void push(const T& val); void pop() {if (empty())return;--_top;}T top() const {if (empty())throw "stack is empty!"; // 抛异常也代表函数逻辑结束return _pstack[_top - 1]; }bool full() const { return _top == _size; }bool empty() const { return _top == 0; }
private:T *_pstack;int _top;int _size;// 顺序栈底层数组按2倍的方式扩容void expand() {T* ptmp = new T[_size * 2];for (int i = 0; i < _top; ++i) {ptmp[i] = _pstack[i];}delete[]_pstack;_pstack = ptmp;_size *= 2;}
};template<typename T>
void SeqStack<T>::push(const T& val) {if (full())expand();_pstack[_top++] = val;
}int main() {// 类模板的选择性实例化:只有调用到的类模板的函数才会实例化SeqStack<int> s1;s1.push(20);s1.push(30);s1.push(40);s1.push(50);s1.push(60);s1.pop();cout << s1.top() << endl; // 50// 类型参数如有默认值template<typename T=int>//SeqStack<> s2;return 0;
}

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

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

相关文章

深入MapReduce——从MRv1到Yarn

引入 我们前面篇章有提到&#xff0c;和MapReduce的论文不太一样。在Hadoop1.0实现里&#xff0c;每一个MapReduce的任务并没有一个独立的master进程&#xff0c;而是直接让调度系统承担了所有的worker 的master 的角色&#xff0c;这就是Hadoop1.0里的 JobTracker。在Hadoop1…

Baklib深入解析企业内容管理与内容中台的本质差异

内容概要 在当前信息化快速发展的时代&#xff0c;企业迫切需要高效的内容管理解决方案。企业内容管理&#xff08;ECM&#xff09;和内容中台是满足这一需求的两种不同系统。企业内容管理的主要作用是对企业内部的各种文档、数据进行整理和存储&#xff0c;确保信息资源的整合…

Ansible介绍与入门学习

一、Ansible的介绍&#xff08;Ansible is a radically simple IT automation engine 极简的IT自动化工具&#xff09; 1.Ansible是一款 运维的自动化工具&#xff0c;常用于软件部署自动化、配置自动化、管理自动化等&#xff0c;其内置大量的功能模块来满足日常的工作需要…

1.27补题 回训练营

E 智乃的小球 题目描述 在一条无限长的水平直线上&#xff0c;有 n 个小球&#xff0c;每个小球的质量相同&#xff0c;体积可以忽略不计。这些小球初始时位于直线上的不同位置&#xff0c;并且每个小球有一个初始速度&#xff0c;速度为 -1 m/s 或 1 m/s。速度为 -1 m/s 表示…

[JavaWeb]搜索表单区域

一.注意事项 设置外边距:margin:(参数可省去部分)上 下 左 右 二.源代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>Tlias智能学习辅助系统</title> <style> /* 导航栏样…

题单:插入排序

题目描述 给定 n 个元素的数组&#xff08;下标从1开始计&#xff09;&#xff0c;请使用插入排序对其进行排序&#xff08;升序&#xff09;。 输入格式 两行&#xff0c;第一行为一个整数 n&#xff0c;表示元素的个数。 第二行 n 个空格分隔的整数&#xff0c;表示数组的…

PYH与MAC的桥梁MII/MIIM

在学习车载互联网时&#xff0c;看到了一句话&#xff0c;Processor通过DMA直接存储访问与MAC之间进行数据的交互&#xff0c;MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是&#xff0c;将MAC集成进Processor芯片&#xff0c;将PHY留在Processor片外…

前端进阶:深度剖析预解析机制

一、预解析是什么&#xff1f; 在前端开发中&#xff0c;我们常常会遇到一些看似不符合常规逻辑的代码执行现象&#xff0c;比如为什么在变量声明之前访问它&#xff0c;得到的结果是undefined&#xff0c;而不是报错&#xff1f;为什么函数在声明之前就可以被调用&#xff1f…

基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念&#xff1a;由于最近太忙了&#xff0c;更新的比较慢&#xff0c;提前祝大家新春快乐&#xff0c;万事如意&#xff01;本数据集的下载地址&#xff0c;读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析&#xff0c;探索各州的房产市…

范冰冰担任第75届柏林电影节主竞赛单元评委 共鉴电影佳作

近日&#xff0c;备受瞩目的柏林电影节迎来了新一届盛事&#xff0c;而华人演员范冰冰将以主竞赛单元评委身份亮相&#xff0c;引发了广泛关注。此前她已担任过戛纳国际电影节、东京国际电影节、圣塞巴斯蒂安国际电影节等众多电影节主竞赛单元评委。作为国际影坛的知名人物&…

Ollama 运行从 ModelScope 下载的 GGUF 格式的模型

本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么&#xff1f; Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型&#xff0c;并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法&#xff0c;非常简便 但如果希…

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…

【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)

祈愿在2025蛇年里&#xff0c; 伟大的祖国风调雨顺、国泰民安、每个人齐心协力&#xff0c;共同经历这百年未有之大变局时代&#xff08;国际政治、AI技术……&#xff09; 祝福亲友同事孩子们平安健康&#xff08;安全、安全、安全&#xff09;、巳巳如意&#xff01; 背景需…

在彼此的根系里呼吸

爱如草木&#xff0c;需以晨露滋养&#xff0c;而非绳索捆缚。一段健康的亲密关系&#xff0c;恰似两株根系相连却各自向阳的树——风起时枝叶相触&#xff0c;晴空下共享光影&#xff0c;却始终保有向地心深处生长的自由。那些纠缠的根须是信任编织的网&#xff0c;容得下沉默…

2025年1月30日(任意截面、自定义截面梁的设置)

Ansys 在ANSYS中&#xff0c;以下是这些术语的详细解释&#xff1a; Nodal Solution (节点解): Nodal Solution指的是在有限元分析中计算出的节点处的物理量解。通常包括节点的位移、反应力等信息。节点解是分析结果的基础&#xff0c;因为它们可以用来计算其他重要的物理量&a…

doris:MySQL Load

Doris 兼容 MySQL 协议&#xff0c;可以使用 MySQL 标准的 LOAD DATA 语法导入本地文件。MySQL Load 是一种同步导入方式&#xff0c;执行导入后即返回导入结果。可以通过 LOAD DATA 语句的返回结果判断导入是否成功。一般来说&#xff0c;可以使用 MySQL Load 导入 10GB 以下的…

unity使用内置videoplayer打包到安卓手机进行视频播放

1.新建UI&#xff0c;新建RawImage在画布当作视频播放的显示载体 2.新建VideoPlayer 3.新建Render Texture作为连接播放器视频显示和幕布的渲染纹理 将Render Texture同时挂载在VideoPlayer播放器和RawImage上。这样就可以将显示的视频内容在RawImage上显示出来了。 问题在于&a…

应用程序中处理文件上传的方法

在应用程序中处理文件上传通常涉及以下几个步骤: 一、前端准备 前端负责收集文件,并通过 HTTP 请求将其发送到服务器。常见的方法包括: ①HTML <form>; 表单:使用 enctype="multipart/form-data" 属性指定表单支持文件上传。 ②JavaScript (AJAX):可以使…

oracle 分区表介绍

oracle 分区表介绍 Oracle 分区表是一个非常强大的数据库功能&#xff0c;可以将一个大的表分割成多个更小、更易管理的块&#xff08;分区&#xff09;。这种分区结构在处理大规模数据时非常有用&#xff0c;因为它能改善性能、简化维护和管理&#xff0c;并支持高效的数据存取…

【Envi遥感图像处理】008:波段(批量)分离与波段合成

文章目录 一、波段分离提取1. 提取单个波段2. 批量提取单个波段二、波段合成相关阅读:【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用 一、波段分离提取 1. 提取单个波段