简介
std::numeric_limits类模板定义在头文件<limits>
中,提供查询多种算术类型的属性的标准化方式
比如int类型的最大值为std::numeric_limits<int>::max()
如何提供这些信息呢?
模板特化!
标准库为所有的类模板都制定可用的特化,例如:
- std::numeric_limits 针对有 cv(constant value) 限定的类型 cv T 的特化的每个成员的值都与对无 cv 限定的类型 T 的特化的对应成员的值相同。例如
std::numeric_limits<int>::digits
等于std::numeric_limits<const int>::digits
。 - 算术类型的别名(例如 std::size_t 或 std::streamsize)也可以用 std::numeric_limits 类型特征予以检测。
- 非算术标准类型,例如
std::complex<T>
或std::nullptr_t
,没有特化。 - 实现可以对实现特定的类型提供 std::numeric_limits 的特化:例如 GCC 提供
std::numeric_limits<__int128>
。非标准的库可以为库所提供的类型添加特化,例如 OpenEXR 为 16 位浮点数类型提供std::numeric_limits<half>
。
模板参数
template< class T > class numeric_limits;
T为要获取数值属性的类型
成员常量
挑几个讲
is_specialized
has_quiet_NaN
是否为静默非数(可以在错误的计算中传播下去,方便后续处理或调试,如果为signaling NaN会直接抛出异常)
只有浮点型才有NaN,has_quiet_NaN用于鉴别该浮点型能不能表示quiet NaN