用法:
推荐类模板用class,函数模板用typename,目前都兼容
template <class T> //推荐类模板用class,函数模板用typename,目前都兼容
void Swap(T & a,T & b)
{
T tmp;
tmp = b;
b = a;
a = tmp;
}
int main()
{
int c = 1, d = 2;
Swap(c, d);
cout << "c=" << c << ", d=" << d << endl;
}
注意:使用函数模板时,必须明确函数类型(编译器自动推导或手动指定),确保实参与函数模板能匹配上,手动指定如下:但若手动指定类型与实际数据类型不匹配,在编译阶段也会报错!
Swap<int>(c, d);
函数模板的具体化(特例化)
语法用例:
template <> void Swap(int& a, int& b)
{
int tmp;
tmp = b;
b = a;
a = tmp;
cout << "使用函数模板的具体化!" << endl;
}
主函数调用时,可使用以下代码调用,也可使用Swap(a,b)调用(没有优先级冲突的情况下)
Swap <>(a, b);
当同时存在同一功能的普通函数、函数模板和具体化的函数模板时,其使用规则:具体化优先于常规模板,普通函数优先于具体化和常规函数模板,
函数模板只是函数的描述,没有实体,使用的时候,编译器才给它生成函数实体
decltype关键字
用法:要么返回数据类型或数据类型的引用,可与auto搭配丰富函数模板的使用,如下:
template <typename T1, typename T2>
auto add(T1 a,T2 b)->decltype(a+b)
{
return a + b;
}
其中C++14进行了升级,可忽略后面的delctype(a+b),如下,这里之所以不能将delctype(a+b)直接放在前面作为返回值的数据类型的原因是,a,b的作用域不在前面。
template <typename T1, typename T2>
auto add(T1 a,T2 b)
{
return a + b;
}