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;
}