通常,数值型别的极值是与平台相关的特性。C++标准程序库通过template numeric_lim-its提供极值,取代了传统C语言所采用的预处理器常数。整数常数定义于<climits>和<limit.h>中,浮点常数定义于<cfloat>和<float.h>中。极值的概念有两个优点:①提供了较好的型别安全性;②程序员可借此自定义模板来核定极值。
C++标准中规定了各种型别必须保证的最小精度。如果能够注意并运用该极值,较容易写出与平台无关的程序。各种数据类型的最小长度见表9-6。
表9-6 各种类型的内存长度
STL提供了类模板class numeric_limits<>。使用模板通常是为了对所有型别给出通用的解决方案。此外,在必要时使用模板template为每个型别提供共同的接口。STL不仅提供通用的模板template,还提供其特化(Specialization)板本。类模板numeric_limits即是该技术的典型例子。
1)通用性的模板(template)为型别提供默认极值。
通用性template将成员is_specialized设置为false。对型别T而言,无所谓极值的存在。
2)各具体型别的极值由特化版本(Specialization)提供。
通常is_specialized设置为true,所有其他成员都根据特定型别的具体极值加以设定。通用性的类模板numeric_limits及其特化版本均放在头文件<limits>中。C++ STL的特化版本涵盖了所有数据基本型别:
模板类numeric_limits的所有成员及其意义见表9-7。其中第三列对应相应的C常数,这些常数包含在头文件<climits>、<limits.h>、<cfloat>和<float.h>中。(www.xing528.com)
表9-7 模板类numeric_limits的成员说明
(续)
注:表格中“意义”一栏中的诸多解释可能会有不合理之处。著者能力有限,敬请广大读者批评指正。
下面介绍一个简单的实例(摘自《C++标准程序库》)。
例9-7
例9-7的执行结果为:
程序执行结果的最后一行表示型别string没有定义数值极限,因为string并非数值型别。对任何型别可以进行询问:是否定义了极值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。