C++基础7:模板编程/泛型编程
1、基本概念
1.1 什么是模板?
模板(Template)是允许函数或者类通过泛型(generic types)的形式表现或运行的特性
1.2 模板有什么用?
模板可以使函数或者类只写一份代码而对应不同的类型
1.3 模板编程/泛型编程
一种独立于特定类型的编码方式
1.4 模板分类
模板分为函数模板与类模板两类
(1)函数模板(Function template):使用泛型参数的函数(function with generic parameters)
(2)类模板(Class template):使用泛型参数的类(class with generic parameters)
2、函数模板
2.1 模板声明
template <模板形参表> 函数返回类型 函数(形参表);
2.2 模板定义
template <模板形参表>
函数返回类型 函数(形参表){
函数体;
};
2.3 例子及模板实例化
例子:
template <typename T> T Max(T a,T b){
return a>b?a:b;
}
模板实例化:
函数(实参表)
产生模板特定类型的函数或者类的过程称为实例化
调用函数模板与调用函数完全一致
实例:
最值函数Max(),Min()
字符串转数值Ston()
3、类模板
3.1 模板声明
template <模板形参表> class 类名;
3.2 模板定义
template <模板形参表>
class 类名 {
}
3.3 模板实例化
类名<模板实参表> 对象;
3.4 模板参数等
1、模板参数表
多个模板参数之间,分割。模板参数,模板参数,…
2、模板参数
3、类型形参
class 类型形参或者typename 类型形参
类模板的声明与实现通常都写在头文件中,是不能够分开的。
3.5 实例
复数类Complex
三角形类Triangle
4、模板参数推导/推演(deduction)
模板参数推导/推演(deduction):由模板实参类型确定模板形参的过程。
实例化有两类:
显示实例化:代码中明确指定类型的实例化
隐式初始化:根据参数类型自动匹配的实例化
类模板参数允许自动类型转换(隐式转换);函数模板参数不允许自动类型转换(隐式转换)
在模板参数列表中,class和typename完全一样。但是在语义上,class表示类,typename代表所有类型(类以及基本类型)。
请尽量使用typename
模板实例化时:
Max(2,2.4)
参数推导会出现模板实参类型int与double不一致的错误。
解决方法:
1、每个模板参数独立类型
template <typename T , typename U> inline const T& Max(const T& a, const U& b)