C++/函数模板
外观
< C++
函数模板的类型推断
[编辑]可以如同调用普通函数一样调用模板函数,而不用显示的指明模板参数的类型。
模板函数的参数的类型推断
[编辑]- 如果调用参数是按引用传递的,任何类型转换都不被允许。
- 如果调用参数是按值传递的,那么只有decay是被允许的。所谓的decay是指:const 和volatile限制符会被忽略,引用会被忽略,数组会被转化为指针。
- 不能对默认参数进行类型推断
template <typename T>
void f( T a = 1 )
{
}
f();// Error : 无法推断T的类型
模板函数的返回类型推断
[编辑]c++11的返回类型推断方法为尾置返回类型(Trailing Return Type)
template<typename T1, typename T2>
auto add( T1 a, T2 b ) -> decltype( a + b )
{
return a + b;
}
c++14开始的返回类型推断方法可由auto自动推导,但前提是:返回类型必须能通过函数体中的返回语句推断出来,而且多个返回语句之间的推断结果必须一致:
template<typename T1, typename T2>
auto add( T1 a, T2 b )
{
return a + b;
}
也可以使用std::common_type_t来推断返回类型:
template<typename T1, typename T2>
std::common_type_t<T1, T2> add( T1 a, T2 b )
{
return a + b;
}