模板:C++的泛型机制,通用性,为了摆脱对类型的依赖
模板:函数模板 类模板
1.函数模板--》模板作函数用
template<typename T>//函数模板
T Sum(T a,T b)
{
return a+b;
}
调用点:Sum<int>(10,20);
2.模板函数
int Sum(int a,int b)
{
return a+b;
}
3.模板实例化
(1)定义点:只编译模板的头部-->告诉编译器有这样一个模板存在
(2)调用点:模板实例化后的模板函数
4模板实参推演:
(1)不能产生二义性
(2)有实参
5.模板特例化(专用)
(1)完全特例化(全特化)--->一个类型(函数模板)
(2)部分特例化(偏特化)--->一部分类型
6.类型参数 typename | class<>
template<typename T>
bool Compare(T a,T b)
{
return a>b;
}
template<>//模板特例化
bool Compare(const char*a,const char*b)
{
return strcmp(a,b)>0;
}
模板的重载:1>3>2
1.普通函数版本
2.模板版本
3.模板特例化版本
为什么模板的整个定义都在.h中?
普通函数 头部(声明) .h
实现(定义) .cpp
目标文件不会过大,整个定义点编译一次,共享库方式加载进来
模板在编译阶段以编译单元(在一个源文件编译时看不到其他源文件)方式编译,.cpp有Sum模板,但是没有调用点,没有模板实例化,也就没有模板函数生成。
main.cpp
template <typename T>
T Sum(T,T);
int main()
{
Sum<int>(10,20);//int Sum(int,int) ,调用点实例化生成函数符号?Sum@@YAHHH@Z ,要有函数声明--》未定义区--》整个程序没有模板函数生成
return 0;
}
Sum.h在预编译阶段处理,头文件内容展开,源文件整个模板定义。(调用点+定义点)模板函数
类模板:不允许实参推演
1.类模板
template <typename T>
class Node
{
public:Node(T val=T ())
:mdata(val),pnext(NULL)
{}
private:
T mdata;
Node<T> *pnext;
};
int main()
{
Node<int> node(10);
return 0;
}
2.模板类
class Node<int>
{
public:
Node(int val=T());
private:
int mdata;
Node<int>*pnext;
};
3.类模板的实例化:选择性实例化(使用哪个函数,类模板实例化哪个函数)
4.Vector容器:拷贝构造模板会退化成构造函数
5.容器适配器:
(1)类型参数:typename | class
(2)非类型参数:简单的变量(不是浮点型|类类型)
(3)模板
6.链表:
typename和class的区别:
typename 声明模板中的一个类型
<>模板类型参数列表中,class 类标识,typename声明模板中的一个类型
7.类模板特例化
完全特例化 :模板的逻辑不能满足一个类型需求
部分特例化:模板逻辑不能满足一部分类型需求