2014-10-18 103 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