C++模板初阶

本文介绍了泛型编程的概念,重点讲解了函数模板和类模板的工作机制,包括模板参数、实例化过程以及类型推演的重要性。同时提到函数模板与非模板函数的调用优先级和类型转换规则。
摘要由CSDN通过智能技术生成

泛型编程——编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

函数模板

1、函数模板代表了一个函数家族,该函数模板与类型无关,在使用时根据实参类型产生函数的特定类型版本

2、标准模式

template<typename T1,typename T2,typename T3,......,typename Tn>
template<class T1,class T2,class T3,......,class Tn>
template<typename T>
void Swap( T& left, T& right)
{
 T temp = left;
 left = right;
 right = temp;
}

3、函数模板不是真正的函数,只是一个模具,在函数编译阶段,编译器通过传来的参数类型来推演生成对应类型的函数以供调用。例如上面的swap函数,传来的参数是double类型时,生成一份专门处理double类型的函数,对其他类型也一样。

4、因为函数需要根据传参的类型来推衍相应的函数,所以传参类型不一致的话,会导致编译器报错。在此时就可以人为规定数据类型来进行编译。

int main(void)
{
 int a = 10;
 double b = 20.0;
 
 // 显式实例化
 Add<int>(a, b);
 return 0;
}

在函数名后的<>符号内加入具体的数据类型,就能确定模板参数的实际类型

函数模板参数

1、一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非参数模板

2、对于废模板函数和同名函数模板,如果其他条件都相同,则在调用函数时会优先调用非函数模板,而非从模板函数里产出一个实例;而如果模板函数可以产生一个更匹配的函数,则选择模板函数

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

类模板 

标准模式

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

类模板的实例化——类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值