將decltype 與可變參數模板函數結合使用
當嘗試使用decltype 編寫返回具有適當類型的總和的可變參數模板函數時,它可能會遇到一些意想不到的問題。
問題
最初,宣告的函數沒有尾隨回傳型別。但是,當傳遞多個參數時,編譯器會將函數解釋為未定義。使用尾隨返回類型聲明函數可以解決兩個以上參數的問題,但會導致不同類型參數的返回類型不正確。
問題
decltype 是無法推斷兩個以上參數的t sum(p...) 的類型,因為可變參數函數模板僅在返回類型之後宣告
解決方法
為了避免decltype中的這種遞歸調用,可以使用自訂特徵類別。 sum_type 類別決定多個參數總和的類型,無需遞歸推導。
更新的程式碼
將程式中的decltype 替換為型別名sum_type
#include <iostream> #include <type_traits> using namespace std; template<class T> typename std::add_rvalue_reference<T>::type val(); template<class T> struct id{typedef T type;}; template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
此方法傳回decltype((a b) c) 而非decltype(a (b c))。要獲得 decltype(a (b c)) 的更精確結果,請修改最後一個特化,如下所示:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
以上是如何使用'decltype”和可變參數模板函數來求和參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!