以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的問題。