Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

整数特性

动机
概要
描述
测试程序
致谢

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]),都提供了具有以下编译时常量定义的特化版本

成员

类型

is_integral

bool

true

const_min

T

等效于 std::numeric_limits<T>::min()

const_max

T

等效于 std::numeric_limits<T>::max()

注意:提供了 is_integral 标志,因为用户定义的整数类应特化 std::numeric_limits<>::is_integer = true,而编译时常量 const_minconst_max 不会为该用户定义的类提供,除非也特化了 boost::integer_traits。

程序 integer_traits_test.cpp 练习了 integer_traits 类。

Beman Dawes、Ed Brey、Steve Cleary 和 Nathan Myers 在 1999 年 8 月的 boost 邮件列表中讨论了整数特性思想。


PrevUpHomeNext