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++将用该数据类型替换模板中的全部类型参数,由编译器生成与具体的数据类型相关的可以运行的程序代码,这个过程称为模板的实例化。由函数模板实例化生成的函数称为模板函数 , 由类模板实例化生成的类称为模板类
相关推荐
樱木Plus9 小时前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_3 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星3 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛5 天前
delete又未完全delete
c++
端平入洛6 天前
auto有时不auto
c++
哇哈哈20217 天前
信号量和信号
linux·c++
多恩Stone7 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马7 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝7 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode