c++11特性之一 模板(1) 模板函数的默认模板参数
在c++98中,由于实现的问题,编译器不支持模板函数的类型参数带默认值。这一特性在c++11中得到支持。
为什么引入
请看如下例子:
template<typename T>
void fun(T val = 0){
cout<<val;
}
int main(){
fun(1);//编译通过
fun();//编译失败
}
可以看到,在main函数中实例化fun()函数时,由于编译器无法推导出T的类型,导致便以失败。因此,在c++11中为了解决这类问题,为模板函数的模板参数增加了默认值功能,使编译器在无法推导类型时,也能正常编译。
P.S.编译器仅根据实参推导类型,不会根据形参默认值推导!
如何使用
template<typename T=int>
void fun(T val = 0){
cout<<val;
}
这样一来,编译器就会在无法推导类型时,使用int类型作为模板实例类型。
模板类型推导规则
优先级由高到低:
- 显式指定类型 ,如fun
(10); - 推导类型,如fun(3.14); 编译器将推导出float类型。
- 模板参数默认值,如fun(); 上例中默认为int。