2011-07-21 65 views
2

我有一個模板統計類有範圍參數。使用numeric_limits默認參數值

template <typename T> 
class limitStats 
{ 
public: 
    limitStats(T mx, T min) : 
     max(mx), 
     min(mn), 
     range(mx-mn) 
    {;} 

private: 
    const T max; 
    const T min; 
    const T range; 
} 

我想把最大和最小允許值的默認值,但最小值是不同的浮點和整數類型。

通常情況下,我可以寫

T min_val = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max(); 

我發現,我不能用它作爲默認參數

limitStats(T mx = std::numeric_limts<T>::max(), 
      T mn = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max()) 

有沒有達到這樣的事情的一種方式?

回答

3

您可能想重新考慮您的設計。 std::numeric_limits沒有提供您的limitStats,您在做什麼?

不要複製std::numeric_limits設計的壞處。例如,std::numeric_limits<double>::min()被錯誤地命名。最小二倍是最大二倍的加法倒數。 std::numeric_limits是對符號和濫用模板的濫用。在我看來,當然。

您對min的建議是不合格的。考慮一下limitStats<unsigned int>的默認設置。

使用默認值,您的range對簽名整數無效。對於未簽名的整數,它複製max,假設您用limitStats<unsigned int>::min修復了問題。對於浮點類型,它是無效的或重複max,具體取決於您的意思是limitStats<floating_point_type>::min

它允許默認值有意義嗎?如果你不提供默認值,並且默認的構造函數是private/unimplemented,你甚至不會有這個問題。

2

有這麼多的語法錯誤和錯別字,這是很難說哪那些是你的問題。

numeric_limits是一個模板,因此您可以使用它作爲numeric_limits<int>::is_integer或模板類型numeric_limits<T>::max()來訪問它。

0

我只是打想有一個像下面的函數簽名在Windows上的Visual Studio試圖創建一個DLL

當同樣的問題
int 
GetARandomNum(
    int lowest = std::numeric_limits<int>::min(), 
    int highest = std::numeric_limits<int>::max()); 

當嘗試不同的東西,我決定從stdafx.h刪除#inlcude <windows.h>和事情開始建設好了。考慮到'stdafx.h'在VS中被默認選中並且不包含它或者不會對編譯錯誤造成任何影響,所以我決定簡單地將#inlcude <windows.h>stdafx'h移動到cpp文件中,在需要DLL文件的情況下通常只在dllmain.cpp中。我不知道爲什麼Windows.h正在搞亂C + 11頭文件,但我之前也看到類似的問題。