- 模板: 模板编译时就要实例化,声明和定义都要写在一起放头文件中。这样才能被CPP引用文件中在编译时具现。定义和程序员在使用模板类时最常犯的错误是将模板类视为某种数据类型。所谓类型参量化(parameterized types)这样的术语导致了这种误解。模板当然不是数据类型,模板就是模板,恰如其名:编译器使用模板,通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation) 从模板类创建得到的类型称之为特例(specialization)。 模板层层封装 简化接口 应对需求。
- 函数模板: 一般而言,函数模版需要通过参数进行类型推断。没有参数的函数模板必须通过显示实例化来使用。
#include<iostream>
//声明模板函数
template <typename T>
T fun();
//模板特化 T为int
template<>
int fun()
{
return 9;
}
//模板特化 T为double
template<>
double fun()
{
return 3.4;
}
template <typename T>
void Swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
float c = 12.3;
float d = 23.4;
//Swap(c, d); //自动推导实例化类型
Swap<float>(c, d); //显示指定实例化类型
std::cout<<fun<int>()<<std::endl;//显式指定实例化
std::cout<<fun<double>()<<std::endl; //显式指定实例化
return 0;
- 模板的声明和定义: 模板实例化取决于编译器能够找到可用代码来创建特例(称之为实例化要素,point of instantiation)。要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。模板实例化过程是迟钝的,即只能用函数的定义来实现实例化。类模板的声明和定义要放在同一个文件。