2014-10-18 88 views
2

我試圖從可變參數模板類型列表中獲取最大類型。我得到意想不到的結果:從可變類型列表中獲取最大類型

// Bigger between two types 
template<typename T1, typename T2> 
using Bigger = std::conditional_t<sizeof(T1) >= sizeof(T2), T1, T2>; 

// Recursion helper 
template<typename...> 
struct BiggestHelper; 

// 2 or more types 
template<typename T1, typename T2, typename... TArgs> 
struct BiggestHelper<T1, T2, TArgs...> 
{ 
    using Type = Bigger<T1, BiggestHelper<T2, TArgs...>>; 
}; 

// Exactly 2 types 
template<typename T1, typename T2> 
struct BiggestHelper<T1, T2> 
{ 
    using Type = Bigger<T1, T2>; 
}; 

// Exactly one type 
template<typename T> 
struct BiggestHelper<T> 
{ 
    using Type = T; 
}; 

template<typename... TArgs> 
using Biggest = typename BiggestHelper<TArgs...>::Type; 

這裏的結果的一個例子:

sizeof(double) -> 8 
sizeof(Biggest<int, char, long, std::string, long long, double>) -> 4 

我在做什麼錯?我希望返回一個大於4的數字。

+2

([testcase](http://coliru.stacked-crooked.com/a/d3a43d2f54533f76)) – 2014-10-18 18:02:15

回答

9

類型應該是T1越大,最大剩餘類型的,而不是T1BiggestHelper</*...*/>(它是一個空的結構)就越大。此外,爲了記錄,列表中最大的類型幾乎可以是std::string,而不是double

template<typename T1, typename T2, typename... TArgs> 
struct BiggestHelper<T1, T2, TArgs...> 
{ 
    using Type = Bigger<T1, typename BiggestHelper<T2, TArgs...>::Type>; 
          //^^^^^^^^^       ^^^^^^ 
}; 

Demo

+0

+1:幹得好。 :-) – 2014-10-18 18:07:42

+0

我覺得很愚蠢!謝謝 – 2014-10-18 18:09:57