2011-09-24 96 views
2

我需要對我的C++ 11可變參數版本std::min,std::max的實現進行反思。這裏是我的兩個選擇爲std::min,其中std::max由只是std::max更換std::min類似實施:對C++的反思std :: min()和std :: max()的變體模板版本

/*! 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 and \p args. */ 
template <class T, class ... R > 
//requires SameType <T , Args >... 
T multi_type_min(const T & a, const R &... b) 
{ 
    return std::min(a, multi_type_min(b...)); 
} 

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

關鍵問題是,如果我們需要common_type_min呢?請注意,這允許min()被一個參數調用。這會導致混亂或問題嗎?

+0

你不能遞歸,直到你得到2個參數?沒有要求特別停止1參數。 –

+0

我知道如何做到這一點。我只是想知道,爲了算法的一般性,容器包裝器例如'std :: tuple'允許'min'和'max'採用一個參數是否更好。 –

+0

我傾向於說單個值的最小值沒有意義,但是1元元組的最小值確實有意義。也許最好爲容器類型重載'min()'。 –

回答

2

難道你不能只寫它,直到你停在兩個參數?

這裏的(未經測試)片段:

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

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

我猜當有多個常見類型的common_type_min變種是必要的。考慮比較shortlong的值。由於類型提升,short將被轉換爲long作比較。但是,某些應用程序約束或不變量可能會讓您知道這兩個值都可以由short表示。在這種情況下,您可能需要common_type_min<short>(a,b)

+0

請注意,此版本的'multi_type_min'是* right *關聯的。我們不應該寧願選擇左邊嗎? –

+0

@Nordlöw:在我看來,這是一個任意的決定。爲什麼所有的比較都要在左操作數的類型中執行?不應該'std :: min(1,1.0)'返回一個double?如果是這樣,不應該'multi_type_min(1,1,1,1.0)'也返回一個double? –