-
什么是泛型编程
编写与类型无关的逻辑代码,是代码复用的一种手段
-
模板只是泛型编程的一种
1、函数模板代表了一个函数家族,与类型无关,调用的时候参数化,根据实参类型生成对应的参数模板
2、函数模板不是真正的函数,是给编译器制定了一种生成代码第的规则
3、在编译阶段-----》根据实参推演出参数类型-----》生成对应的函数模板
4、执行的时候调用的是生成的具体的函数而不是模板
5、不会做类型提升,除非显示指明
6、非模板函数可以和同名函数模板共存,并且函数模板可以被实例化成这个非模板函数(是两部分代码),执行的时候默认调用自己写的,除非告诉编译器必须使用推演生成的
7、模糊类型,就是将用与特定功能的函数中的类型信息模糊处理,这样产生的就是模板
-
用法初识
#include <iostream>
using namespace std;
//template<typename T> 作用相同
//template<class T, class T1>
//声明T是一个类型
template<class T>
//模板函数
T Add(T left, T right)
{
return left + right;
}
//同名非模板函数
int Add(int left, int right)
{
return left + right;
}
int main()
{
//下面都是隐式实例化,不会显式告诉编译器参数类型,让其自己推演
cout << Add(1, 3) << endl; //推演出整型类型函数
//推演出来的函数和推演出来的一样,此处调用自己编写的明确类型函数
cout << Add<>(1, 3) << endl; //这样使用表示告诉编译器当有同名函数存在时也用推演生成的函数
cout << Add(1.5, 2.0) << endl; //。。。浮点数。。
cout << Add('a', 'b') << endl; //。。。字符类型。。
cout << Add(1, '1') << endl; //整数和字符类型
cout << Add(1, (int)'1') << endl; //相当于强转
//下面是显示实例化,告诉编译器生成这个类型的函数
cout << Add<int>(1, 3) << endl;
cout << Add<int>(1, '1') << endl;
return 0;
}