是否有任何关于使用数字限制宏(例如INT64_MAX)而不是std :: numeric_limits的论据?根据我的理解,numeric_limits在标准中,但宏仅在C99中,因此非标准.
Dav*_*one 14
其他答案大多数都有正确的信息,但似乎这需要更新C++ 11.
在C++ 11, ,std::numeric_limits<T>::min()
,std::numeric_limits<T>::max()
并std::numeric_limits<T>::lowest()
都宣称constexpr
,这样他们就可以在大多数同上下文的是可用的INT_MIN
和公司.我能想到的唯一例外是使用#
字符串化标记的编译时字符串处理.
这意味着,numeric_limits
可用于标签的情况下,模板参数,等等,你在通用的代码中使用它的好处(建议使用INT_MIN
对比LONG_MIN
中template<typename T> get_min(T t);
).
C++ 11还为James Kanze所讨论的问题提供了一个解决方案,通过添加std::numeric_limits<T>::lowest()
,它给出了所有类型的最低有限值,而不是整数类型的最低值和浮点类型的最低正值.
Jam*_*nze 10
肯定是预C++ 0x. INT_MIN
并且INT_MAX
是整数常数表达式; numeric_limits<int>::min()
而numeric_limits<int>::max()
不是. <climits>
是标准的C++,除非你正在处理模板(你不知道它是否是),int
否则long
没有理由去处理过于复杂的解决方案.(另外:如果您正在编写模板,请不要忘记numeric_limits<int>::min()
并numeric_limits<double>::min()
表示完全不同的属性;如果您想要最小可能值,则需要numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max()
.)
如果是C++,请使用numeric_limits
,结束.
编辑:好的,根据詹姆斯的评论,而不是"结束." - 例外是模板和案例标签.但是,我看不到用于最小或最大的案例标签或者模板的用途,但我想我没有看到所有可能性......
我想我的观点是numeric_limits
模板更有用,max()
而且min()
......
std::numeric_limits
尽管在 C++11 中,常量constexpr
可以在模板等中使用,但至少在一种情况下您必须<climits>
使用/中的宏<cstdint>
。它是预处理器。在 C++ 中,预处理器与 C 中一样受到限制,因此它不能使用普通变量,无论是 aconst
还是constexpr
one。结构成员更不用说了,模板化结构更不用说了。因此您不能执行以下操作:
#include <cstddef>
#include <limits>
// Won't work!
#if std::numeric_limits<std::size_t>::max() > std::numeric_limits<unsigned>::max()
// ...
#endif
Run Code Online (Sandbox Code Playgroud)
相反,您应该求助于以下工作(并且更具可读性!)变体:
#include <cstdint>
#include <climits>
// Works fine
#if SIZE_MAX > UINT_MAX
// ...
#endif
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3451 次 |
最近记录: |