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

C++编程指南32 - 模板编程时要避免过度约束以提高通用性

一:概述

        由于使用模板会提高代码的抽象级别,所以在编写模板代码时,要尽量让代码更灵活、通用,而不是只针对某些特定的操作或类型。目的是为了提高代码的重用性和效率。

二:示例

        举个例子,假设我们要写一个求和函数 sum。如果只要求类型 T 具备简单的“能增加”能力(比如使用 += 或者 +),那么我们可能会错过一些其他更通用的方式,导致只能用特定的类型(比如只能用能进行加法的类型)。这会限制代码的可扩展性和适应性。

template<typename T>
    requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
    for (auto x : v) s += x;
    return s;
}

template<typename T>
    requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
    for (auto x : v) s = s + x;
    return s;
}

    这里假设 Incrementable 不支持 + 操作,Simple_number 不支持 += 操作,我们就会过度约束 sum1sum2 的调用者。而且在这种情况下,我们错失了一个编写成通用代码的机会。

        改进的方式是,使用更通用的约束,比如要求类型 T 是一个“算术类型”(即支持加法和加法赋值)。这样就可以保证无论是什么类型,只要它符合“算术”的标准,就可以使用 sum 函数了。这不仅避免了对类型的过度限制,还能让代码适用于更广泛的情况。

template<typename T>
    requires Arithmetic<T>
T sum(vector<T>& v, T s)
{
    for (auto x : v) s += x;
    return s;
}

三: 总结 

  • 不要过度限制模板的类型要求,让代码更通用。

  • 尽量避免只要求单一操作,要考虑更通用的操作集合。

  • 用概念来约束类型,而不是直接依赖操作符,这样代码能处理更多类型,增加灵活性和复用性。

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

相关文章:

  • 蓝桥杯训练士兵
  • 单点登录(SSO)实战:基于Vue与Spring Boot的深度实现
  • 蓝桥复习3(AT240C2 EE2PROM IIC ) 继电器 蜂鸣器 PWM
  • 汇编学习之《push , pop指令》
  • LeetCode 94. 二叉树的中序遍历
  • PUSCH(Physical Uplink Shared Channel,物理上行共享信道)
  • 自动备份文件到服务器,自动备份文件到服务器有哪些方法?
  • SkyWalking+Springboot实战(最详细)
  • mysql 日期时间变成中文显示
  • 如何解决 Hive 在创建 MySQL 表时出现乱码???的问题
  • 堤坝决口快速沉箱,守护生命的抗洪防线|鼎跃安全
  • 《认知觉醒》下篇·第四章第二节“学习专注:深度沉浸是进化双刃剑的安全剑柄” 总结
  • Layui日期选择器的使用逻辑
  • 23种设计模式-结构型模式-装饰
  • 如何在 SwiftUI 视图中使用分页(Paging)机制显示 SwiftData 数据(三)
  • 藏族问候语语料库下载-选取按方言区分类的藏语问候语音频
  • 卷积层里的多输入多输出通道
  • 论文笔记:ASTTN模型
  • LINUX 1
  • [Linux实战] Linux设备树原理与应用详解
  • 并发多线程八股
  • ML 聚类算法 dbscan|| OPTICS
  • 使用 glog 库的 CHECK 宏进行条件断言和错误检测
  • K-均值聚类
  • DeepBI如何探索流量种子,快速帮助产品扩展流量
  • 卷积神经网络(CNN)原理与实战:从LeNet到ResNet
  • C 语 言 --- 整 形 提 升
  • 第三章 devextreme-react/scheduler 定制属性学习
  • 第十届MathorCup高校数学建模挑战赛-A题:无车承运人平台线路定价问题
  • Oceanbase企业版安装(非生产环境)