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