1

所以这个问题出现了,在进行一些简单的编码时,请考虑以下内容;

for(unsigned int x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

上面的代码在假设'sizeof(unsigned int) >= 4'的情况下按预期工作,但是正如我们所知,在某些平台上这可能不是真的,因此我对类似的东西很感兴趣;

for(RangeBasedInt<0x00000000, 0xFFFFFFFF>::type x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

其中'RangeInt'是一个模板,'type'是最小的整数类型,足以容纳从MINIMUM(0x00000000)到MAXIMUM(0xFFFFFFFF)的值范围;

template<int MINIMUM, int MAXIMUM>
struct RangeBasedInt
{
    // Type based upon MINIMUM and MAXIMUM
    typedef /* MAGIC */ type;
};

所以问题很简单:

  1. 这是在标准库的某个地方实现的吗?
  2. 如果没有,是否有实现此功能的库,或者我是否必须基于 std::numeric_limits 构建自己的库
4

1 回答 1

2

自己实现这一点真的很容易。很容易我会说它是用语言实现的:

typedef decltype(0xFFFFFFFF) RangeBasedInt;
for(RangeBasedInt x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

2.14.2 [lex.icon] 指出整型文字的类型是可以容纳该值的最小类型。因此,如果int可以保留0xFFFFFFFF您的机器,则RangeBasedInt可能是int. 在我的机器上,它是unsigned int.

对于这个特定的限制 ( 0xFFFFFFFF),标准保证它可以用一种内置的整数类型来表示。 ULONG_MAX必须不小于 4294967295 (0xFFFFFFFF),并且ULLONG_MAX必须不小于 18446744073709551615 (0xFFFFFFFFFFFFFFFF)。

更新

我站在 Skeen 的技术上纠正。[lex.icon] 中的表 6 实际上并没有说“最小类型”。它实际上是说,如果文字是八进制或十六进制常量,它将是以下列表中可以表示其值的第一个类型:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

该表继续根据文字是否为小数以及是否带后缀指定不同的列表。当我说“最小”时,我肯定是在解释。有关确切的详细信息,请查阅实际标准,而不是 SO 答案(由我或其他任何人)。在我写这篇文章时,C++1y 的最新草案是N3691

于 2013-08-03T00:34:57.463 回答