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++将用该数据类型替换模板中的全部类型参数,由编译器生成与具体的数据类型相关的可以运行的程序代码,这个过程称为模板的实例化。由函数模板实例化生成的函数称为模板函数 , 由类模板实例化生成的类称为模板类
相关推荐
保持清醒5406 分钟前
类和对象上
c++
hold?fish:palm30 分钟前
7 接雨水
开发语言·c++·leetcode
流浪0012 小时前
数据结构篇(五):线性表——栈
数据结构·c++·算法
郝学胜-神的一滴2 小时前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
ch0sen1pm2 小时前
刚学完 CAS 原子操作,我花了一晚上写了三个无锁队列
c++
qeen872 小时前
【C++】vector的模拟实现详解(二)
c++·学习·算法·迭代器·stl
j7~3 小时前
【C++】C++ 继承全解析:从基本语法到菱形继承的底层原理
开发语言·c++·继承·组合·虚继承·#暑假·七月创作之星博客挑战赛
数行拙笔3 小时前
C++客户端---String类型
开发语言·c++·bootstrap
草莓熊Lotso3 小时前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
selfsongs14 小时前
指针、内存管理、现代 C++ 特性
c++