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