光阴似箭催人老,日月如移越少年。
並不同意 @孫明琦 的觀點。我們現在把問題簡化成四種情況:
直接指定的函數類型…我沒有發現 C++ 有能中途改變函數宣告的回傳類型的,直接寫回傳型別就是了,寫 decltype(fn()) 徒增麻煩。
函數模版,且傳回型別是某個模版參數。那也沒必要「動態獲取」,直接用 T、U 之類的就是了。
函數模版,但傳回型別由另一個運算子決定。考慮下面這個例子:
template <typename T, typename U> auto fn(T a, U b) { return a + b; }
顯然可知,這裡的 auto == decltype(a + b),所以我們仍然能夠直接指定該變數的型別為 decltype(a + b).
lambda。這個也沒什麼差別,反正 lambda 就是匿名 class 的 operator(),回傳值也必須是以上的三種。
綜上所述,我並不認為 C++ 有什麼需要「動態取得」的型別,一切都必須確定,畢竟強型別。
自動,decltype
這樣
decltype(fun())
std::result_of
動態取得?不可能,C++沒有反射(RTTI除外)其他答案所說的的decltype和std::result_of都是靜態的,編譯時確定,應該也能符合你的要求
自動 fn() -> decltype(表達式){
}
用decltype
並不同意 @孫明琦 的觀點。我們現在把問題簡化成四種情況:
直接指定的函數類型…我沒有發現 C++ 有能中途改變函數宣告的回傳類型的,直接寫回傳型別就是了,寫 decltype(fn()) 徒增麻煩。
函數模版,且傳回型別是某個模版參數。那也沒必要「動態獲取」,直接用 T、U 之類的就是了。
函數模版,但傳回型別由另一個運算子決定。考慮下面這個例子:
顯然可知,這裡的 auto == decltype(a + b),所以我們仍然能夠直接指定該變數的型別為 decltype(a + b).
lambda。這個也沒什麼差別,反正 lambda 就是匿名 class 的 operator(),回傳值也必須是以上的三種。
綜上所述,我並不認為 C++ 有什麼需要「動態取得」的型別,一切都必須確定,畢竟強型別。
自動,decltype
這樣
std::result_of
動態取得?不可能,C++沒有反射(RTTI除外)
其他答案所說的的decltype和std::result_of都是靜態的,編譯時確定,應該也能符合你的要求
自動 fn() -> decltype(表達式)
雷雷{
}
用decltype