主页 > IT业界  > 

C++STL---<limits>

C++STL---<limits>
一、核心模板类 numeric_limits<T>

用于查询算术类型属性,需特化类型 T(如 int, float)后使用。

#include <limits> using namespace std; 二、常用静态成员函数(需通过 :: 调用) 成员函数作用描述示例(int类型)min()类型最小值numeric_limits<int>::min() → -2147483648max()类型最大值numeric_limits<int>::max() → 2147483647epsilon()浮点类型精度(1与最小>1值的差)numeric_limits<float>::epsilon() ≈ 1.192e-07digits类型的有效位数(不含符号位)numeric_limits<char>::digits → 7is_signed类型是否带符号numeric_limits<unsigned>::is_signed → falseis_integer是否为整数类型numeric_limits<double>::is_integer → false
三、特殊值检测(浮点类型专用) numeric_limits<float>::has_infinity; // 是否支持无穷大 numeric_limits<float>::infinity(); // 正无穷值 numeric_limits<float>::quiet_NaN(); // 非信号NaN(Not a Number)

示例

// 检查float类型是否支持无穷大表示 static const bool has_infinity = numeric_limits<float>::has_infinity; // 获取正无穷大值 float inf = numeric_limits<float>::infinity(); // 获取非信号NaN(安静型非数) float nan = numeric_limits<float>::quiet_NaN();
四、底层特性与平台适配 numeric_limits<int>::is_modulo; // 溢出是否取模(如无符号类型为true) numeric_limits<char>::is_iec559; // 是否符合IEEE 754标准(仅浮点) numeric_limits<double>::round_style; // 舍入方式(如round_to_nearest)

应用代码示例

// 检查int类型溢出是否取模运算 const bool int_modulo = numeric_limits<int>::is_modulo; // 典型应用场景 template<typename T> T safe_increment(T val) { if (numeric_limits<T>::is_modulo) { return val + 1; // 安全操作 } else { if (val < numeric_limits<T>::max()) return val + 1; throw overflow_error("Exceeded maximum value"); } } // 获取当前浮点环境的舍入方式 const float_round_style style = numeric_limits<double>::round_style; // 根据舍入模式选择算法 if (style == round_to_nearest) { // 使用统计友好的算法 } else if (style == round_toward_zero) { // 财务计算首选模式 }
五、与C风格宏的对比优势

对比C语言的 <climits> 和 <cfloat>:

类型安全:避免宏的类型错误(如 INT_MAX 误用于 long)泛型友好:模板代码中可统一接口扩展性:支持用户自定义类型的特化
六、实际应用场景

防止数值溢出

template<typename T> T safe_add(T a, T b) { if (a > numeric_limits<T>::max() - b) throw overflow_error("Addition overflow"); return a + b; }

浮点数判等(考虑精度)

bool almost_equal(double a, double b) { return abs(a - b) < numeric_limits<double>::epsilon(); }

动态类型特性检查

template<typename T> void print_range() { if constexpr (numeric_limits<T>::is_signed) { cout << "Range: [" << numeric_limits<T>::min() << ", " << numeric_limits<T>::max() << "]\n"; } }
七、扩展:自定义类型特化(示例) class MyCustomType { /*...*/ }; namespace std { template<> class numeric_limits<MyCustomType> { public: static constexpr bool is_specialized = true; static MyCustomType max() { return MyCustomType(100); } // 定义其他必要成员... }; }
八、注意事项 非算术类型(如类/字符串)默认无特化版本编译时常量:所有成员均为 constexpr,可用于模板元编程C++11后新增 lowest() 函数,返回类型最小有限值(对浮点类型更准确)

你没有走错路,你是在等待风的到来。 —伊吹有喜

标签:

C++STL---<limits>由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++STL---<limits>