当前位置: 首页 > 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;
}

三: 总结 

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

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

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

相关文章:

  • 蓝桥杯训练士兵
  • 单点登录(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设备树原理与应用详解
  • 特朗普促卡塔尔说服伊朗放弃核计划,伊朗总统:你来吓唬我们?
  • 马上评|这种“维权”已经不算薅羊毛,涉嫌犯罪了
  • 马上评|让查重回归促进学术规范的本意
  • 河南信阳拟发文严控预售许可条件:新出让土地开发的商品房一律现房销售
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 全球医药股普跌,A股创新药板块下挫