C++——模版(函数模版和类模版)

C++ 模板(Templates)完整介绍

模板是 C++ 中一种强大的泛型编程机制,允许开发者编写与类型无关的代码,从而提高代码的复用性和灵活性。

通过模板,可以避免为不同数据类型重复编写相似的函数或类,实现真正的代码复用。

1. 模板的基本概念

1.1 为什么需要模板?

  • 避免代码重复:传统函数或类需要为不同数据类型(如 intdoublestring)重复实现相同逻辑。
  • 类型安全:模板在编译时生成特定类型的代码,避免运行时类型错误。
  • 提高效率:减少类型转换和重复代码,提升性能。

1.2 模板的两种形式

  • 函数模板:适用于函数,可以处理多种数据类型。
  • 类模板:适用于类,可以定义通用的类结构。

2. 函数模板

2.1 基本语法

template <typename T>  // 或 template <class T>
T max(T a, T b) {return (a > b) ? a : b;
}
  • template <typename T>:声明一个模板,T 是类型参数(可以是 intdoublestring 等)。
  • T max(T a, T b):定义一个泛型函数,参数和返回值类型均为 T

2.2 使用示例

int main() {int a = 5, b = 10;double x = 3.14, y = 2.71;cout << max(a, b) << endl;    // 输出:10(自动推导 T=int)cout << max(x, y) << endl;    // 输出:3.14(自动推导 T=double)
}
  • 自动类型推导:编译器根据参数类型自动推导 T 的具体类型。
  • 显式指定类型
cout << max<int>(3.14, 2.71);  // 强制 T=int,结果截断为 3

2.3 多个类型参数

template <typename T, typename U>
T min(T a, U b) {return (a < b) ? a : b;
}
  • 用途:适用于参数类型不同的情况(如 int 和 double 比较)。

3. 类模板

3.1 基本语法

template <typename T>
class Stack {
private:vector<T> data;
public:void push(T value) {data.push_back(value);}T pop() {T value = data.back();data.pop_back();return value;}
};
  • template <typename T>:声明一个类模板,T 是类型参数。
  • vector<T>:使用泛型类型 T 定义成员变量。

3.2 使用示例

int main() {Stack<int> intStack;    // 实例化一个存储 int 的 StackStack<string> strStack; // 实例化一个存储 string 的 StackintStack.push(42);strStack.push("Hello");cout << intStack.pop() << endl;  // 输出:42cout << strStack.pop() << endl;  // 输出:"Hello"
}
  • 显式指定类型:必须明确指定 T 的具体类型(如 Stack<int>)。

3.3 模板特化(Template Specialization)

  • 作用:为特定类型提供定制化的实现。
  • 示例
template <>
class Stack<bool> {  // 针对 bool 类型的特化版本
private:vector<int> data;  // 用 int 存储 bool(节省空间)
public:void push(bool value) {data.push_back(value ? 1 : 0);}bool pop() {int value = data.back();data.pop_back();return value != 0;}
};
  • 用途:优化特定类型的性能或行为(如 bool 类型)。

4. 模板的编译与实例化

4.1 编译过程

  1. 模板定义:编译器看到模板代码,但不立即生成代码。
  2. 实例化:当使用模板时(如 max(3, 5) 或 Stack<int>),编译器根据具体类型生成对应的代码。
  3. 类型检查:编译器检查类型是否合法(如 max("a", "b") 会报错,因为 string 没有 > 运算符)。

4.2 显式实例化

template class Stack<double>;  // 强制编译器生成 Stack<double> 的代码
  • 用途:减少编译时间,或确保某些类型被编译。

5. 模板的优缺点

5.1 优点

  • 代码复用:一套代码处理多种数据类型。
  • 类型安全:编译时检查类型,避免运行时错误。
  • 性能优化:无类型转换开销,接近手写代码的效率。

5.2 缺点

  • 编译时间增加:模板代码在每次使用时都会实例化,可能导致编译变慢。
  • 错误信息复杂:模板错误通常难以阅读(尤其是多层嵌套时)。
  • 不支持运行时多态:模板是编译时多态,无法像虚函数那样在运行时动态绑定。

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

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

相关文章

Python之cv2:cv2(OpenCV,opencv-python)库pip下载超时、下载失败、无法下载的解决方案大全

Python之cv2&#xff1a;cv2(OpenCV&#xff0c;opencv-python)库pip下载超时、下载失败、无法下载的解决方案大全 在学习和使用 OpenCV&#xff08;Python 包名&#xff1a;opencv-python 或简称 cv2&#xff09;的过程中&#xff0c;很多初学者常常会遇到通过 pip install o…

asyncio 与 uvloop

事件循环 事件循环 协调所有协程执行的中央调度器&#xff0c;它通过非阻塞机制&#xff0c;实现并发执行多个异步任务。 事件循环是 异步编程的核心机制&#xff0c;用一句话概括就是&#xff1a; 事件循环不断检查任务队列&#xff0c;一旦某个异步任务完成&#xff0c;它…

一文读懂循环神经网络(RNN)—语言模型+n元语法(1)

目录 什么是语言模型&#xff1f; 语言模型的核心目的 一.量化文本的合理性 二.支持下游 NLP 任务 三. 语义和上下文依赖 一元语法、二元语法和三元语法详解 核心概念&#xff1a;n-gram 模型 1. 一元语法&#xff08;Unigram&#xff09; 2. 二元语法&#xff08;Bigram…

DirectX12(D3D12)基础教程九 间接绘制

在学习directx12 microsoft提供了很多示例&#xff0c;有简单的也有复杂,下载网址&#xff1a;https://github.com/microsoft/DirectX-Graphics-Samples 本章对D3D12ExecuteIndirect 示例做了简化&#xff0c;只保留间接绘制部分&#xff0c;删除了计算着色器部分。 间接绘制…

fastApi连接数据库

1&#xff1a;pip install tortoise-orm2&#xff1a;pip install aiomysql3&#xff1a;pip install asyncmy或者使用国内清华园pip install -i https://pypi.tuna.tsinghua.edu.cn/simple asyncmy4&#xff1a;pip install aerich通过 python -m 直接运行&#xff08;推荐&a…

Apache-web服务器环境搭建

目录 实验要求 思路总结 1.常规配置web服务 2.通过用户主页配置web服务 3.通过虚拟目录配置web服务 4.添加DNS解析服务&#xff0c;访问虚拟机域名&#xff1a; www.TestWeb.com 实验要求 (ip 192.168.48.130) 1、常规配置web服务 2、通过用户主页配置web服务 3、通过虚…

Altium Designer 25 安装与配置完整教程

本教程将带您一步步完成 Altium Designer 25 的下载、安装与激活配置 第一步&#xff1a;下载安装包 首先&#xff0c;需要获取 Altium Designer 25 的完整安装程序。 &#x1f449; 下载链接&#xff1a; 百度网盘&#xff1a;百度网盘 请输入提取码 提取码: dxei 夸克网盘…

【工具】AndroidStudio修改中文语言汉化

AndroidStudio修改中文语言汉化 https://github.com/sollyu/AndroidStudioChineseLanguagePackhttps://github.com/sollyu/AndroidStudioChineseLanguagePack

代码随想录|图论|15并查集理论基础

并查集理论基础 | 代码随想录 并查集还是比较简单的&#xff0c;只要搞清楚两个事情&#xff1a; 并查集是干啥的&#xff1f;解决什么类型问题&#xff1f;并查集模板&#xff08;背下来&#xff09; 1、并查集是干啥的 并查集主要是两个功能&#xff1a; 两个元素添加到…

用MYSQL学习sql第一次总结和作业

总结 数据库&#xff08;Database&#xff09; 理解为“文件夹”&#xff0c;里面可以装很多张表。作业中要求先建一个名字叫 mydb6_product 的数据库。 表&#xff08;Table&#xff09; 理解为“Excel 工作表”&#xff0c;由“列&#xff08;字段&#xff09;”和“行&…

SQLite技术架构解析,适用场景有哪些?

一、SQLite技术架构解析 SQLite是一款轻量级、无服务器、嵌入式关系型数据库&#xff0c;其架构设计围绕“简化复杂性、提升效率”展开&#xff0c;核心由前端&#xff08;SQL处理&#xff09;、执行引擎&#xff08;VDBE&#xff09;、存储引擎&#xff08;B-Tree&#xff09;…

【Luogu】每日一题——Day3. P6392 中意 (数学 取模)

链接&#xff1a;P6392 中意 - 洛谷 题目&#xff1a; 思路&#xff1a; 数论这一块 题目让我们求这个结果对 MOD 取模&#xff0c;那么我们肯定是不像看到这个除法&#xff0c;所以考虑如何消除这个除法 我们可以想到&#xff0c;向上取整就是加上一个数&#xff0c;假设其为…

React强大且灵活hooks库——ahooks入门实践之DOM类hook(dom)详解

什么是 ahooks&#xff1f; ahooks 是一个 React Hooks 库&#xff0c;提供了大量实用的自定义 hooks&#xff0c;帮助开发者更高效地构建 React 应用。其中 DOM 类 hooks 是 ahooks 的一个重要分类&#xff0c;专门用于处理 DOM 相关操作&#xff0c;如事件监听、元素状态、拖…

GeoTools 工厂设计模式

前言使用GeoTools开发时有必要了解其工厂设计模式&#xff0c;作为软件开发核心设计模式&#xff0c;其设计思想具有普遍性和研究性。明白方法原理有助于提高开发效率&#xff0c;达到事半功倍的效果。1. 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是面向对象中…

npu-smi info命令参数解释

华为昇腾npu-smi显示npu-smi工具的帮助信息npu-smi -h字段说明-h命令的帮助信息–help命令的帮助信息-vnpu-smi版本信息info显示硬件详细信息set修改设备配置属性clear清除设备信息upgrade升级MCU固件 npu-smi info 用于监控和管理华为NPU的状态和性能字段值说明npu-smi24.1.rc…

OneCode3.0 通信架构简介——MCPServer微内核设计哲学与实现

在数字化转型加速的今天&#xff0c;低代码平台已成为企业快速交付应用的核心基础设施。然而&#xff0c;通用消息中间件与低代码开发范式之间存在难以调和的矛盾&#xff1a;标准化协议无法匹配可视化编排的动态性&#xff0c;通用架构难以满足低代码场景下高频短消息的性能需…

Android14 Launcher3 修改All App上下滑动头部显示阴影

正常情况下的样子&#xff1a; 下拉App抽屉后的样子&#xff1a;修改方案&#xff1a;qssi14/packages/apps/Launcher3/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.javaprotected void updateHeaderScroll(int scrolledOffset) {float prog1 Utilities…

Zookeeper入门安装与使用详解

文章目录一、简介二、下载安装1、安装jdk2、windows&#xff08;1&#xff09;下载&#xff08;2&#xff09;配置与启动一、简介 略。 二、下载安装 1、安装jdk 安装jdk8&#xff0c;高版本可能会有问题。 2、windows &#xff08;1&#xff09;下载 官网地址&#xff…

设计模式之适配器模式:让不兼容的接口协同工作的艺术

适配器模式&#xff1a;让不兼容的接口协同工作的艺术在软件开发中&#xff0c;我们经常会遇到系统整合的挑战——如何让新旧组件协同工作&#xff1f;适配器模式正是解决这类接口不兼容问题的利器&#xff0c;本文将深入探讨这一经典设计模式。1. 引言&#xff1a;接口不兼容的…

AI驱动的软件工程(中):文档驱动的编码与执行

&#x1f4da; 系列文章导航 AI驱动的软件工程&#xff08;上&#xff09;&#xff1a;人机协同的设计与建模 AI驱动的软件工程&#xff08;中&#xff09;&#xff1a;文档驱动的编码与执行 AI驱动的软件工程&#xff08;下&#xff09;&#xff1a;AI辅助的质检与交付 大家好…