函數模板中使用類型萃取(traits)替換類型推導(deduce)

以max函數爲例,通常是以宏的形式出現的

#define max(a, b) (((a) > (b)) ? (a) : (b))

 

但是在C++中,我們可能用模板替換它(對於內建類型,我們可以不寫const&)

template<typename T>

T const& max(T const& a, T const& b)

{

    return (a > b ? a : b);

}

 

 

當然我們可能提供兩個模板參數,但這裏我們演示的是隻提供一個模板參數的解決方法

 

很多時間我們會使用0的情況,於是下面的使用將導致編譯失敗,原因是編譯器推導出double和int兩種類型,而模板參數只有一個T,岐義

double m = max(1.0, 0);

 

同理,對於所有可隱式轉換的類型(如內建類型int, char, short, __int64,float, double等),都不能調用max函數

 

解決的一個辦法是,我們使用類型萃取的方法實現,如下

template<typename T>

T const& max(T const& a, typename std::iterator_traits<T*>::value_type const& b)

{

    return (a > b ? a : b);

}

 

這時上面的調用便正確了

double m = max(1.0, 0);

 

反之亦然

double m = max(0, 1.0);

 

 

擴展:

對於函數中用戶可能傳指針NULL時,類型推導都會失敗,這時如果用戶不想在調用函數時進行強制轉換的話,那麼程序員在實現就可以採取類型萃取的方式,這時便能剔除掉將NULL推導出int類型的困擾了。

 

 

當然有望C++0x解決nullptr的問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章