C++ 标准库的 <limits> 头文件提供了一个类模板 numeric_limits<>
,并为每个基本类型提供了特化版本。
对于整数类型,std::numeric_limits<>
中有趣的成员有
static const bool is_specialized; // Will be true for integer types. static T min() throw(); // Smallest representable value. static T max() throw(); // Largest representable value. static const int digits; // For integers, the number of value bits. static const int digits10; // The number of base 10 digits that can be represented. static const bool is_signed; // True if the type is signed. static const bool is_integer; // Will be true for all integer types.
在许多情况下,这些都足够了。但是 min() 和 max() 存在问题,因为它们不是常量表达式 (std::5.19),然而某些用法需要常量表达式。
模板类 integer_traits
解决了这个问题。
namespace boost { template<class T> class integer_traits : public std::numeric_limits<T> { public: static const bool is_integral = false; // // These members are defined only if T is a built-in // integal type: // static const T const_min = implementation-defined; static const T const_max = implementation-defined; }; }
模板类 integer_traits
派生自 std::numeric_limits
。主特化版本添加了单个 bool
成员 is_integral
,其编译时常量值为 false
。但是,对于所有整数类型 T
(std::3.9.1/7 [basic.fundamental]),都提供了具有以下编译时常量定义的特化版本
成员 |
类型 |
值 |
---|---|---|
|
bool |
|
|
|
等效于 |
|
|
等效于 |
注意:提供了 is_integral 标志,因为用户定义的整数类应特化 std::numeric_limits<>::is_integer = true
,而编译时常量 const_min
和 const_max
不会为该用户定义的类提供,除非也特化了 boost::integer_traits。
程序 integer_traits_test.cpp
练习了 integer_traits
类。
Beman Dawes、Ed Brey、Steve Cleary 和 Nathan Myers 在 1999 年 8 月的 boost 邮件列表中讨论了整数特性思想。