模板 (泛型编程)
函数模板
语法:
template <typename 形参名,typename 形参名,......> 返回类型 函数名(参数列表)
{函数体
}
- 定义函数模板时
typename
关键字可以替换成class
,效果一样。template<class T>
- 自动类型推导,必须推导出一致的数据类型T才可以使用。
- 模板必须要确定出T的数据类型,才能使用。
- 函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
- 函数模板调用时,如果显示指定类型,可以发生隐式类型转换。
- 如果函数模板和普通函数都可以调用,优先调用普通函数。
- 可以通过空模板参数列表的形式强制调用函数模板。
- 函数模板可以发生函数重载。
- 如果函数模板可以产生更好的匹配,优先调用函数模板。
- 函数模板针对特定类型可以具体化。例如
person
类型:
//通用模板
template<class T>
bool myCompare(T a, T b)
{
...
}
//具体化
template<> bool myCompare(Person p1, Person p2)
- 利用具体化的模板可以解决自定义类型的通用化。
类模板
语法:
template<typename 形参名,class 形参名,…> class 类名
{ ... };
- 定义类模板时
typename
关键字可以替换成class
,效果一样。template<class T>
- 类模板没有自动类型推导的使用方式。只能用显示指定类型。
- 类模板在模板的参数列表中可以有默认参数类型。
template<class NameType, class AgeType = int>
class Person
{
...
};
- 类模板中的成员函数在调用时才创建。
STL标准模板库
智能指针
引用
引用做参数