c++泛型编程-模板

  • 函数模板
  • 类模板
void Swap(int& left, int& right)
{
 int temp = left;
 left = right;
 right = temp;
}
void Swap(double& left, double& right)
{
 double temp = left;
 left = right;
 right = temp;
}
void Swap(char& left, char& right)
{
 char temp = left;
 left = right;
 right = temp;
}

对于实现不同类型的交换函数,我们可以使用函数重载来实现,但是只要有一种新的类型出现,我们就要写一种函数,这样代码的复用性比较低,代码的可维护性也比较低,c++提供了模板,来解决这个问题,注意模板只是简化了程序员的工作,让编译器根据不同的类型来实现不同类型的函数/类,

一.函数模板

1.1函数模板的定义

函数模板代表了一些功能相同,但是参数类型不同的函数。如果没有调用函数模板,函数模板并没有占据空间,只有调用时才会开辟空间,根据具体参数类型产生对应的函数。

1.2格式
template<class T1, class T2....>
返回值类型 函数名(参数列表)
{
	//---
}
  • template:是关键字
  • class:是定义模板参数的关键字,也可以用typename
1.3原理

在编译阶段,编译器根据传入的实参类型来进行推导出对应模板参数类型,然后产生一份专门处理对应类型的函数代码。
image.png

1.4使用

对于模板函数实例化,可以隐式的调用,编译器会自动推导出模板参数的类型,也可以显示调用

template<class T>
void Swap(T& a, T& b)
{
     T tmp = a;
     a = b;
     b = tmp;
}
int main()
{
    //隐式实例化
    int a = 1, b = 2;
    Swap(a, b);

    //显式实例化
    Swap<int>(a, b);
    return 0;
}

注意:

  • 当一个非模板函数和模板函数同时存在时(可以实例化为非模板函数的模板函数),编译器会调用非模板函数

二.类模板

2.1类模板的定义
template<class T1, class T2, ..., class Tn>
class 类模板名
{
 	// 类内成员定义
};
2.2类模板的使用

类模板和函数模板不同,类模板只能显式调用,因为编译器不能自动推导类型。

template<class T>
class A
{
}
int main()
{
    A<int> aa;
    A<double> bb;
}
  • 注意:typedef不能替代模板,因为模板可以同时实例化两个类型不同的类,而typedef类只有一份
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值