首先了解什么是模板:
在C语言中如果我们想实现一个函数供客户使用,需要考虑到各种情况,拿一个两数相加的函数来说,我们就不能为其指定数据类型,所以我们通常有以下几种实现方法:
1,利用C语言中的泛型,即void*来实现。
2,利用函数重载来实现。
3,利用宏函数来实现。
在c++中,我们可以通过模板来实现。
例如:
template<typename T>
T Sum(T a,T b)
{
return a + b;
}
int main()
{
Sum<int>(10,20);
}
main函数上面的部分就叫做函数模板。
模板都是在编译阶段处理的,利用typedef重定义了类型,而不是用宏替换,这样可以避免#define的一些不足之处,例如没有语法检查以及不安全等缺点。
模板的编译分两步:
1,在函数模板的定义点编译模板的头部。
2,在函数的调用点编译模板的实例化版本(模板函数)。
main函数里面对模板进行了实例化,给出了模板类型T-->int。函数模板可以所给出的实参推演出函数模板的类型。
3,函数模板实参推演的注意事项:
1)不能让编译器产生二义性
2)必须有推演依据(即有实参)
4,函数模板的特例化:和函数模板的修饰要一致
template<>
void Show<char*>(char* a, char* b)
{
std::cout << "template<>" << std::endl;
std::cout << a << std::endl;
std::cout << b << std::endl;
}
5,模板的重载的三种形式(优先级从上到下):
1)普通函数版本
2)模板的特例化版本
3)模板的版本
6,模板的类型参数
7,模板的非类型参数
1)常量
2)不能是float double
8,接受一个不明确类型
9,函数模板的默认值 c++11支持 c++98类模板支持默认值 函数模板不支持默认值
template<typename T, typename E, typename R = long>
R Mul(T a, E b)
{
R rt = R();
rt = a*b;
return rt;
}