一、泛型编程
概念:
在c语言中,同一种功能的函数,由于参数类型不同,虽然可以用函数重载,但可能需要重复多次的定义,又或者是不同类型的数据需要用到同一种数据结构时,需要定义大部分重复的类,因此,提出了模板去实现泛型编程,而泛型编程就是指编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
二、函数模板
概念:
函数模板在定义时,只针对其功能进行设计,而不具体到某个具体数据类型,在使用时编译器会自动识别类型进行转换
格式:
template<typename T,typename S...>
typename是关键字,也可以用class代替,例子:
template<typename T> //此处的typename可以用class代替
void Swap( T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
实例化:
隐式实例化:
由编译器去自动识别类型,在实例化时不给出具体类型,直接使用函数,若是类型无法匹配则会报错,而不会自动将部分进行类型转换。
显式实例化:
在函数后给出具体的类型,当参数类型与给出的类型不匹配时会自动转换成隐式匹配,由编译器去识别匹配,此时若还是无法匹配则直接报错,例如:
以下代码展示了如何实例化,而由于a,b类型不同,最终程序结果会报错
template<class T>
void swap(T& a,T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int a;
double b;
swap(a,b);//隐式实例化
swap<int>(a,b);//显示实例化
return 0;
}
模板参数的匹配原则:
1.当显示实例化给定的类型不匹配时,会由编译器去根据模板定义自动识别匹配,若还是无法完全匹配则会报错
2.当既存在模板函数,又存在同名的函数,且其余条件也都相同时,会优先匹配到非模板函数,但如果参数存在歧义,模板函数能给出更好的匹配方案时,则会采用模板函数
3.模板函数中不会进行类型转换
三、类模板
概念:
类模板是针对多种类型参数需要用到同一种类进行数据管理或者其他操作时,避免重复定义,同样提出了模板的概念
格式:
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
队列、栈这些常见的数据结构,在定义中,比起以前用typedefine去宏观定义参数,用模板则可以直接定义,且在实例化时,可以实例化不同类型的参数,需要注意的是,类模板只能用显示实例化,而不能用隐式的(隐式存在歧义)
总结:
本篇内容讲了C++ 中的一个重要语法——模板,对一些比较基础的模板以及其用法进行了一个总结归纳。