函數模板返回值可定義為模板參數,但無法自動推導,需顯式指定。因顯式指定順序為左至右,返回值參數宜置於最左,其餘參數可透過實參推導。
C++11 引入 auto 配合 -> 語法,配合 decltype 實現依賴參數的返回型別推導:
template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {
return a + b;
}
標準庫 <type_traits> 提供型別轉換模板,常用於模板元程式設計:
std::remove_reference<T>::type:移除參考std::add_const<T>::type:添加 conststd::decay<T>::type:退化為值型別(陣列/函數轉指標)typename,告知編譯器這是型別而非靜態成員::type 成員:型別轉換模板透過內嵌 type 成員暴露結果型別// 返回值為模板參數:需顯式指定
template <typename Ret, typename T>
Ret convert(T value) { return static_cast<Ret>(value); }
// 使用:convert<double>(42) → 需指定 Ret,T 推導為 int
// 拖尾返回型別:自動推導
template <typename T, typename U>
auto multiply(T a, U b) -> decltype(a * b) {
return a * b;
}
// 型別特徵應用
template <typename T>
typename std::remove_reference<T>::type
getValue(T&& param) {
return std::forward<T>(param);
}