2011-04-07 122 views

回答

8

如果使用C++,請使用numeric_limits,結束。

編輯:好的,根據詹姆斯的評論,不是「結束」。 - 例外是模板和案例標籤。但是,我看不到用於分鐘或最大的案例標籤或爲他們的模板,但我想我沒有看到所有的可能性...

我想我的觀點是,numeric_limits模板超出max()min() ...

+1

在需要積分常量表達式的上下文中嘗試使用它。說實例化一個模板,或者在一個案例中。或者對於較小的類型,作爲數組維(頻繁出現「UCHAR_MAX + 1」)。 – 2011-04-07 10:59:51

+0

@詹姆斯,嗯..好吧,我會編輯模板和案例標籤,不確定數組維度,雖然... – Nim 2011-04-07 12:08:46

+3

重要說明:自從C++ 11'std :: numeric_limits :: max()'是'constexpr',所以,異常不再成立。 – juanchopanza 2017-05-20 06:40:49

1

在某些情況下(如case標籤,非類型模板參數)數字常量,預計更多的有用的,numeric_limits不支持此:numeric_limits<int>::max()不是一個常數。在case標籤中,您必須改用INT_MAX

這非常煩人,但我聽說C++ 11會解決這個問題。

10

Pre C++ 0x,肯定。 INT_MININT_MAX是整型常量表達式; numeric_limits<int>::min()numeric_limits<int>::max()沒有。 <climits>是標準的C++,除非你正在處理模板(你不知道它是否是intlong),真的沒有理由打擾過於複雜的解決方案。 (另外:如果你正在寫的模板,不要忘了,numeric_limits<int>::min()numeric_limits<double>::min()代表完全不同的屬性,如果你想的最小可能值,你需要numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max()。)

+0

我想補充說,如果你想使用模板中的值,積分常量表達式參數只會計數。 – Xeo 2011-04-07 11:20:21

+0

@Xeo:這是不正確的。當你初始化一個靜態類時它也很重要。 – MSalters 2011-04-07 11:38:34

+0

@MSalters,?如果沒有積分常量,你不能初始化一個整型靜態類? – Nim 2011-04-07 12:02:58

12

其他的答案大都具有正確的信息,但它似乎需要更新C++ 11。

在C++ 11,std::numeric_limits<T>::min()std::numeric_limits<T>::max()std::numeric_limits<T>::lowest()都宣佈constexpr,使他們能夠在大多數相同背景的INT_MIN和公司使用。我能想到的唯一例外是使用#字符串標記的編譯時字符串處理。

這意味着numeric_limits可用於標籤的情況下,模板參數,等等,你在通用的代碼中使用它的好處(在嘗試使用template<typename T> get_min(T t);INT_MINLONG_MIN)。

C++ 11還通過添加std::numeric_limits<T>::lowest()爲James Kanze談到的問題提供了一個解決方案,該解決方案給出了所有類型的最低有限值,而不是整數類型的最低值和浮點數的最低正值。點類型。