7

我是正確的閱讀,從minmax(和minmax爲此事)有新initializer_list變種的標準,但沒有可變參數模板變種?C++ 11中最小和最大變量模板變體?

因此,這是確定:

int a = min({ 1,2,a,b,5 }); 

但這不是:

int b = min(1,2,a,b,5); // err! 

我想,很多人會想到的是可變參數模板可以很容易地實現這一點,因此他們可能會失望。

我會說使用V.T.爲minmax會矯枉過正

  • 可變參數模板能夠處理多種類型的
  • 初始化列表檢查所有類型是設計相同

因此I.L.更適合這項任務。

我的解釋是否正確?

回答

10

您的解釋是正確的。 N2772包含更深入的理由。

+0

所有非常好,但如果有一個可變參數設置仍然有人不得不做一個轉換到'std :: initializer_list'到一個「常見類型」發現(並找到一個很好的約定,找出「普通類型」的目的最小化)。 – alfC 2013-10-28 23:26:25

0

是的我認爲可以說所有的值都是兼容的類型使得列表成爲這個特性的一個很好的候選者。這並不是說你無法編寫自己的可變模板版本。

+0

「could not」或「would not」:-)是的,可能是可能的。我不知道是否應該。對於表達式max(1,2,3.1415,4),我可以想象編譯器要做的所有事情......比如將所有的int都轉換爲double,或者把所有的double都轉換成int '。如果我看到一個可以遞歸嘗試實現的模板...我不知道我是否會信任它。 – towi 2011-05-29 19:42:28

1

這裏是我的解決方案使用可變參數模板有和沒有Boost概念常見類型特徵min在GCC 4.6上測試。不過,我不確定common_type是否需要。

#define LessThanComparable class 
#include <boost/type_traits/common_type.hpp> 


/*! Multi-Type Minimum of \p a. */ 
template <LessThanComparable T> const T & multi_type_min (const T & a) { return a; } // template termination 
/*! Multi-Type Minimum of \p a, \p b and \p args. */ 
template <class T, class ... R > 
//requires SameType <T , Args >... 
T multi_type_min(const T & a, const T & b, const R &... args) 
{ 
    return multi_type_min(a < b ? a : b, args...); 
} 

/*! Minimum of \p a. */ 
template <LessThanComparable T> const T & min(const T & a) { return a; } // template termination 
/*! Minimum of \p a, \p b and \p args. */ 
template <class T, class U, class ... R, class C = typename boost::common_type<T, U, R...>::type > 
C min(const T & a, const U & b, const R &... c) 
{ 
    return min(static_cast<C>(a < b ? a : b), static_cast<C>(c)...); 
} 
+0

multi_type_min只接受相同類型的參數。 – Ricky65 2012-01-10 21:52:20