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

【C++】编写通用模板代码的重要技巧:T()

const T& val = T()

以下是vector类模拟实现中 resize() 部分代码:

/* resize */
// val不能给0,因为不知道T的类型,所以给一个T的缺省值
void resize(size_t n, const T& val = T())
{// 缩小sizeif (n < size())_finish = _start + n;else // 增大size{// 假如需要扩容if (n > capacity()){reserve(n);}while (_finish < _start + n){*_finish = val;++_finish;}}
}

const T& val = T() 的含义

这行代码实际上包含了三个关键概念:

1. T() - 值初始化

  • T() 表示创建一个类型为 T 的临时对象,并使用值初始化

  • 对于内置类型(如 int, double, 指针 等),T() 会将其初始化为零值:

    • int()0

    • double()0.0

    • char()'\0'

    • 指针()nullptr

  • 对于类类型,T() 会调用默认构造函数

2. const T& - 常量引用

  • 使用常量引用可以避免不必要的对象拷贝

  • 常量引用可以绑定到临时对象(如 T() 创建的对象)

3. = T() - 默认参数

  • 这是函数的默认参数,如果调用时不提供这个参数,就使用 T() 作为默认值

为什么要这样设计?

通用性

由于 vector 是模板类,需要处理任意类型 T

  • 如果是 vector<int>T() 就是 0

  • 如果是 vector<string>T() 就是空字符串

  • 如果是 vector<MyClass>T() 会调用 MyClass 的默认构造函数

示例代码:

vector<int> v1;
v1.resize(10);        // 使用默认值 int() = 0,所有新元素初始化为0vector<double> v2;
v2.resize(5);         // 使用默认值 double() = 0.0vector<string> v3;
v3.resize(3);         // 使用默认值 string() = 空字符串// 也可以显式指定值
v1.resize(15, 100);   // 新元素初始化为100
v3.resize(5, "hello");// 新元素初始化为"hello"

为什么不能直接用 0

为什么不能写成 void resize(size_t n, const T& val = 0)

这是因为:

  1. 类型不匹配:如果 Tstring0 不是有效的字符串值

  2. 缺乏通用性:不是所有类型都能从 0 构造

  3. 编译错误:对于不能从 0 转换的类型,代码无法编译

T() 为每种类型提供了最合适的"零值"或默认值,保证了代码的通用性和类型安全。

总结

const T& val = T() 是一个巧妙的设计:

  1. 通用:适用于任何类型 T

  2. 高效:使用引用避免拷贝

  3. 安全:提供类型安全的默认值

  4. 灵活:允许调用者提供自定义值,也有合理的默认值

这种写法在STL和现代C++库中非常常见,是编写通用模板代码的重要技巧之一。

http://www.dtcms.com/a/362807.html

相关文章:

  • 与后端对话:在React中优雅地请求API数据 (Fetch/Axios)
  • 基于STM32的智能语音浴缸设计
  • 工业视觉光源选色指南:白光通用、蓝光显瑕疵、红光能穿透,看完直接用
  • 推荐一个论文阅读工具ivySCI
  • C++内存管理,模板初阶(泛型编程)
  • 项目组文档标准不一致的原因有哪些
  • 设计模式:命令模式(Command Pattern)
  • 测试覆盖率不够高?这些技巧让你的FastAPI测试无懈可击!
  • java-设计模式-3-创建型模式-原型
  • GPT-5 技术应用指南:从底层能力到工业级落地
  • 零基础Linux操作基础小白快速掌握Shell脚本bash的配置文件
  • PHP操作LibreOffice将替换变量后的word文件转换为PDF文件
  • CICD的持续集成与持续交付和Zabbix
  • Rsync + Rsyncd 从入门到项目实战:自动化备份全攻略
  • 系统配置不是“乐高积木”:制造企业如何通过科学变更管理保障稳定运行
  • 关于ANDROUD APPIUM安装细则
  • 科研绘图(二):R 语言实现小鼠脑图谱 3D 渲染,附完整代码与数据获取指南
  • LoRaWAN®协议,如何为工业制造的数字化转型赋能?
  • 《CrystalDiskInfo》 [9.7.2] [单文件版] 下载
  • CHT共轭传热: 导热系数差异如何影响矩阵系数
  • 从0死磕全栈第2天:Vite + React 配置全解析,让你的开发效率飞起来
  • Element-Plus 入门指南
  • 跳出“中央集权”的泥潭:以Data Mesh重构AI时代的活性数据治理
  • MongoDb(②pymongo)
  • 豪华酒店品牌自营APP差异对比分析到产品重构
  • 腾讯混元世界模型Voyager开源:单图生成3D世界的“核弹级”突破,游戏、VR、自动驾驶迎来新变量
  • C++ 面试高频考点 力扣 852. 山脉数组的峰顶索引 二分查找 题解 每日一题
  • ansible循环
  • GitHub Classroom:编程教育的高效协作方案
  • 从零开始的云计算生活——第五十七天,蓄势待发,DevOps模块