C++之模板

  • 某些程序除了所处理的数据类型之外,程序代码和程序功能相同,但为了实现他们,却不得不编写多个与具体数据类型紧密结合的程序。例如
cpp 复制代码
int Min(int a, int b){
    return a<b?a:b;
}
float Min(float a, float b){
    return a<b?a:b;
}
double Min(double a, double b){
    return a<b?a:b;
}
char Min(char a, char b){
    return a<b?a:b;
}
  • 如何简化以上编程呢?C语言中,可以通过宏的方式实现以上想法:
cpp 复制代码
#define Min(x,y) ((x)<(y)?(x):(y))
  • C++中,也可以利用宏来进行类似程序设计,但宏避开了C++类型检查机制,在某些情况下可能引发错误,是不安全的。更好的方法就是模板来实现这样的程序设计
  • C++中的模板与制作冰糕的模具很相似,是生产函数或类的模具。模板接收数据类型参数,并根据此类型创建相应的函数或类
  • 对于上面的所有的Min()而已,只需要下面的函数模板就能够生成所有的Min函数
cpp 复制代码
template <typename T>
T Min(T a, T b){
    return a<b?a:b;
}
  • template和typename是用来定义模板的关键字。Min模板不涉及任何具体的数据类型,而是用T代表任意数据类型,称为类型参数
  • Min模板代表了求两个数值最小值的通用算法,它与具体数据类型无关,但能够生成计算各种具体数据类型的最小值的函数。编译器的做法是用具体的类型替换模板中的类型参数T,生成具体类型的函数Min()。比如用int替换掉模板中所有的T就能生成求两个int类型数据的函数Min()
cpp 复制代码
#include <iostream>
using namespace std;
#if 0
int Min(int a, int b){
    return a<b?a:b;
}
float Min(float a, float b){
    return a<b?a:b;
}
double Min(double a, double b){
    return a<b?a:b;
}
char Min(char a, char b){
    return a<b?a:b;
}
#endif
template <typename T>
T Min(T a, T b){
    return a<b?a:b;
}
int main(void){
    int m=9, n=3;
    double d1=1.8, d2=3.4;
    cout << Min(m,n) << endl;
    cout << Min(d1, d2) << endl;
    return 0;
}
  • 从函数模板Min可以看成,C++模板提供了对逻辑结构相同的数据对象通用行为的定义方法,它把通用算法的实现和具体的数据类型区分开来,模板操作的是参数化的数据类型(类型参数)而非实际数据类型。一个带有类型参数的函数称为函数模板,带有类型参数的类称为模板类
  • 在调用模板时,必须为它的类型参数提供实际数据类型,C++将用该数据类型替换模板中的全部类型参数,由编译器生成与具体的数据类型相关的可以运行的程序代码,这个过程称为模板的实例化。由函数模板实例化生成的函数称为模板函数 , 由类模板实例化生成的类称为模板类
相关推荐
大江东去浪淘尽千古风流人物16 小时前
【cuVSLAM】GPU 加速、多相机、实时视觉/视觉惯性 SLAM设计优势
c++·人工智能·数码相机·ubuntu·计算机视觉·augmented reality
自信150413057591 天前
重生之从0开始学习c++之模板初级
c++·学习
历程里程碑1 天前
2. Git版本回退全攻略:轻松掌握代码时光机
大数据·c++·git·elasticsearch·搜索引擎·github·全文检索
极客智造1 天前
深度解析 C++ 类继承与多态:面向对象编程的核心
c++
零号全栈寒江独钓1 天前
基于c/c++实现linux/windows跨平台获取ntp网络时间戳
linux·c语言·c++·windows
CSCN新手听安1 天前
【linux】高级IO,以ET模式运行的epoll版本的TCP服务器实现reactor反应堆
linux·运维·服务器·c++·高级io·epoll·reactor反应堆
松☆1 天前
C++ 算法竞赛题解:P13569 [CCPC 2024 重庆站] osu!mania —— 浮点数精度陷阱与 `eps` 的深度解析
开发语言·c++·算法
(Charon)1 天前
【C++/Qt】C++/Qt 实现 TCP Server:支持启动监听、消息收发、日志保存
c++·qt·tcp/ip
并不喜欢吃鱼1 天前
从零开始C++----七.继承及相关模型和底层(上篇)
开发语言·c++
tankeven1 天前
HJ182 画展布置
c++·算法