news 2026/5/14 5:21:08

【C++ 】模板初阶:从 “重复造轮子” 到通用代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++ 】模板初阶:从 “重复造轮子” 到通用代码
函数模板
1. 基本语法

函数模板的定义需以template关键字开头,后跟模板参数列表,语法格式如下:

代码语言:javascript

AI代码解释

template<typename T1, typename T2, ..., typename Tn> 返回值类型 函数名(参数列表) { // 函数体(使用模板参数T1、T2...作为类型) }
  • 关键字说明:typename用于声明模板参数类型,也可替换为class,二者在模板参数中完全等价(不能用**struct(class和strcut的区别之一)**);
  • 模板参数:可声明多个参数(如T1T2),适配多类型参数的函数场景。

【示例】:通用交换函数

代码语言:javascript

AI代码解释

template<typename T> void Swap(T& a, T& b) { T temp = a; a = b; b = temp; }
2. 核心原理:编译期实例化

函数模板本身不会生成可执行代码,编译器在编译时会根据调用方式,推导模板参数类型并生成具体函数:

  • 调用Swap(1, 2)时,推导Tint,生成Swap<int>函数;
  • 调用Swap(3.14, 5.20)时,推导Tdouble,生成Swap<double>函数;
  • 每个类型对应的函数是独立的,编译后会生成多个不同类型的目标代码。

3. 实例化方式

函数模板支持两种实例化方式,满足不同使用场景:

隐式实例化:编译器根据实参类型自动推导模板参数,无需手动指定(常用);

代码语言:javascript

AI代码解释

template<class T> T Add(const T& a, const T& b) { return a + b; } int main() { Add(1, 2); // 隐式推导T为int Add(1.0, 2.0); // 隐式推导T为double }

显式实例化:手动指定模板参数类型,强制编译器生成对应版本,适用于参数类型不一致的场景;

代码语言:javascript

AI代码解释

Add<int>(1, 2.5); // 强制T为int,2.5隐式转换为int

【错误用法】

【正确用法】

1、显式实例化

2、多参数匹配

4. 模板参数匹配原则

当存在非模板函数与模板函数同名时,编译器遵循以下匹配规则:

  1. 优先匹配完全一致的非模板函数(有现成的菜吃现成的);
  2. 若模板能生成更匹配的版本(非模版函数参数不匹配),则选择模板(现成的不好吃,不如吃自己做的);
  3. 模板函数不支持自动类型转换,普通函数支持隐式类型转换。

【示例】:匹配规则演示

代码语言:javascript

AI代码解释

// 非模板函数 int Add(int a, int b) { return a + b; } // 函数模板 template<class T> T Add(T a, T b) { return a + b; } int main() { Add(1, 2); // 匹配非模板函数 Add(1, 2.0); // 匹配模板,生成Add<int, double> }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 5:18:06

实测Taotoken多模型聚合服务的响应延迟与稳定性观感

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测Taotoken多模型聚合服务的响应延迟与稳定性观感 1. 引言 在将大模型能力集成到实际应用的过程中&#xff0c;开发者除了关注模…

作者头像 李华
网站建设 2026/5/14 5:17:07

ARM架构TLB失效机制与TLBI VALE1OS指令详解

1. ARM架构TLB失效机制概述在ARM架构的处理器中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;是内存管理单元&#xff08;MMU&#xff09;的关键组件&#xff0c;用于缓存虚拟地址到物理地址的转换结果。当操作系统修改页表后&#xff0c;必须确保所有…

作者头像 李华
网站建设 2026/5/14 5:17:06

智能抠图怎么操作?2026年最全工具对比指南,一键去背景其实很简单

最近有个朋友问我&#xff0c;怎么才能快速给商品图去掉背景&#xff0c;做个透明背景的图片用来做海报。说实话&#xff0c;这个需求我也经常遇到——不管是做自媒体内容、制作证件照&#xff0c;还是处理电商图片&#xff0c;智能抠图这个需求真的很日常。我就想着&#xff0…

作者头像 李华
网站建设 2026/5/14 5:12:08

腾讯面试官问:Chunk 到底该怎么切?

别再背 500 tokens overlap 50&#xff1a;它可能把制度条款切碎&#xff0c;让召回片段从 0.83 掉到 0.41。这一课承接上一课"Embedding 怎么评估"&#xff0c;给出 Chunk 切分的真正判断框架。 先把术语翻成人话 chunk&#xff1a;切出来的一小段资料 chunk si…

作者头像 李华
网站建设 2026/5/14 5:12:07

Python生成器与迭代器深度解析

Python生成器与迭代器深度解析一、迭代器协议迭代器是实现了__iter__()和__next__()方法的对象。1.1 自定义迭代器class Counter: def __init__(self, start, end): self.current start self.end enddef __iter__(self): return selfdef __next__(self): if self.current >…

作者头像 李华
网站建设 2026/5/14 5:12:05

Python生成器与迭代器深入理解

Python生成器与迭代器深入理解 引言 迭代是编程中最基本的操作之一。Python通过迭代器和生成器提供了强大而优雅的迭代机制。这些特性不仅使代码更加简洁&#xff0c;还能显著提升内存效率。本文将深入探讨迭代器和生成器的原理、使用方法以及实际应用场景&#xff0c;帮助中…

作者头像 李华