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

泛型编程(简单介绍,通俗易懂)

泛型编程:一份代码,适用多种数据类型,不需要重写很多份。

泛型编程大多c++程序员了解最少地部分,《Effective C++》条款48有讲到。

例子:

假设你要写一个函数,找到两个数字中较大的那个。

int getMaxInt(int a, int b) {return a > b ? a : b;
}double getMaxDouble(double a, double b) {return a > b ? a : b;
}char getMaxChar(char a, char b) {return a > b ? a : b;
}

这样有几个问题:

  • 代码重复,维护成本高

  • 如果增加新的类型(比如 floatlongstd::string),还得再写一遍

可以用泛型编程来解决这个问题:

用模板(template)实现泛型:

template <typename T>
T getMax(T a, T b) {return a > b ? a : b;
}int main() {cout << getMax(3, 7) << endl;        // intcout << getMax(3.5, 7.2) << endl;    // doublecout << getMax('a', 'z') << endl;    // charcout << getMax(string("abc"), string("xyz")) << endl; // stringreturn 0;
}

输出:

7
7.2
z
xyz

1. template <typename T> 

  • template 关键字表示:这是一个模板

  • <typename T> 表示:这里定义了一个占位类型,叫做 T

  • T 不是具体的类型,比如 intdoublestring,而是一个变量,在调用函数的时候由编译器自动替换。

可以把 T 理解成一个“万能胶”,用的时候会自动变成你需要的类型。

2. T getMax(T a, T b)

  • 这行是函数声明,T 是返回值类型。

  • getMax 是函数名。

  • (T a, T b) 表示参数类型是 T,也就是说:参数和返回值都是同一个类型

所以,如果你传入 int,那么 T 会被替换成 int
如果你传入 double,那么 T 会被替换成 double

3. 编译器是怎么处理的

当你写:

cout << getMax(3, 7) << endl;

编译器会在编译期做“模板实例化”,相当于自动生成:

int getMax(int a, int b) {return a > b ? a : b;
}

如果你写:

cout << getMax(3.5, 7.2) << endl;

编译器又会自动生成:

double getMax(double a, double b) {return a > b ? a : b;
}

所以我们只写了一次代码,但编译器帮我们生成了多个版本的函数。

泛型编程的好处

特点没有泛型使用泛型
代码复用需要为不同类型写很多函数一份代码支持多种类型
可维护性修改逻辑要改多份改一处即可
类型安全可能需要用 void* 或强制转换编译器自动检查类型
性能可能需要运行时判断模板在编译期生成专用代码,零开销

泛型编程的应用场景

泛型编程在 C++ 中应用非常广泛,比如:

  • STL(标准模板库)

    • std::vector<int>std::vector<string>

    • std::map<string, int>

    • std::sort()std::find()

  • 智能指针

    • std::unique_ptr<T>std::shared_ptr<T>

  • 自定义容器和算法

例如 std::vector 就是泛型容器:

std::vector<int> v1;      // int 类型的动态数组
std::vector<double> v2;   // double 类型的动态数组
std::vector<string> v3;   // string 类型的动态数组

vector 只写了一份模板代码,C++ 编译器会在编译期自动生成对应类型的代码,这叫做 模板实例化

question:既然 std::vector<int> 写了 int,那不是我手动指定了类型吗?这不算泛型自动识别吧?

tips:泛型不是自动识别,而是自动生成

泛型编程的核心思想是:

写一份模板代码,让编译器根据你指定的类型,自动生成对应的实现。

std::vector<int> v1; 里面的 int 确实是你写的,但关键点在于:

  • 我们只写了一份 vector 模板

  • 你告诉编译器“我要一个 int 版本的 vector

  • 编译器会在编译期生成一个专门存 int 的类

所以,虽然你要告诉编译器类型,但你不需要为每种类型手动写类,这就是泛型的强大之处。


文章转载自:

http://3Mz1459B.nwfxp.cn
http://7jN0tw5v.nwfxp.cn
http://e3rgsFxE.nwfxp.cn
http://hTljxnVH.nwfxp.cn
http://hQrHCUE2.nwfxp.cn
http://TV1NNfJ1.nwfxp.cn
http://Sv67fXeM.nwfxp.cn
http://gmwrsR6B.nwfxp.cn
http://IvpHgjA6.nwfxp.cn
http://VaHU5TBA.nwfxp.cn
http://wsfWsHS7.nwfxp.cn
http://HZFpSlIy.nwfxp.cn
http://iIr99WaO.nwfxp.cn
http://kOhZ6chL.nwfxp.cn
http://s9eKuUlu.nwfxp.cn
http://74Adys2G.nwfxp.cn
http://4cWedgnQ.nwfxp.cn
http://V2G3qvbA.nwfxp.cn
http://aHNbr0Qa.nwfxp.cn
http://O371PguJ.nwfxp.cn
http://wzpxL0yf.nwfxp.cn
http://MW9BUJV4.nwfxp.cn
http://ZfNaHYBX.nwfxp.cn
http://lD2lZTAn.nwfxp.cn
http://OtfZNTMy.nwfxp.cn
http://01tZS0dG.nwfxp.cn
http://ZyULTyVS.nwfxp.cn
http://u2QitnIY.nwfxp.cn
http://pWdGbyOC.nwfxp.cn
http://2OmEnY1v.nwfxp.cn
http://www.dtcms.com/a/372160.html

相关文章:

  • 扩散模型揭秘:生成式AI的核心与应用
  • 【Flink】Flink Runtime 架构设计
  • MySQL数据库同步
  • 使用 Spring Security 实现 OAuth2:一步一步的操作指南
  • Axure: 分组柱状图1
  • CEEMDAN-PSO-CNN-GRU 锂电池健康状态预测matlab
  • Spring Cloud Gateway 作为一个独立的服务进行部署吗
  • webrtc弱网-LossBasedBweV2类源码分析与算法原理
  • leetcode hot100 二叉搜索树
  • 杂学项目1、S32K144与上位机通信
  • GitHub自动化利器:Probot框架实战指南
  • 一款没有任何限制的免费远程手机控制手机的软件简介
  • 企云网多应用授权系统源码 正版查询系统源码
  • Windows netstat 命令使用说明
  • 软件工程:DO-178中的适航要求核心要素
  • Caffeine Count-Min Sketch TinyLFU实现:FrequencySketch
  • 【系统分析师】第7章-基础知识:软件工程(核心总结)
  • 【拍摄学习记录】00-总结记录
  • 探索 CSS 过渡:打造流畅网页交互体验
  • 大语言模型(LLM)的基本概念
  • unsloth FastLanguageModel类主要函数详解,具体作用和参数
  • HTTPS协议——对于HTTP的协议的加密
  • Qwen2.5-VL翻译
  • 碳纤维和短切碳纤维(中)
  • unsloth 笔记: training的时候进行evaluation
  • 【linux kernel 常用数据结构和设计模式】【数据结构 1】【如何表达数据之间的一对一、一对多、多对多关系】
  • 【软件架构设计(19)】软件架构评估二:软件架构分析方法分类、质量属性场景、软件评估方法发展历程
  • 在OpenHarmony上适配图形显示【1】——确认drm是否正常
  • 四大金刚之计算机组成原理
  • 第 15 篇:PCA与降维——如何在信息爆炸的时代,抓住“主要矛盾”?