2010-10-13 71 views
3

我会假设这是C++标准中涵盖的,但我一直无法找到它。我正在编写一些模板,它们将对它们的非类型积分参数进行算术运算,并且我发现在template <int x> Foo这样的模板中需要参数'x'的相当于MAX_INT如何确定模板非类型整型常量参数中的位数?

理想情况下,有人可以将我指向标准中的段落(如果存在的话),该段落给出了整型模板参数大小的允许范围,以及确定特定实现上实际位数的任何方式。

-
澄清:它将作为元编程库的一部分在类型系统内进行数学运算的模板。 'int'永远不会被实例化,并且永远不会占用运行时存储空间。在很多方面,它类似于预处理器所做的数学运算,在这种情况下,我知道整型不能保证与'int'的大小相同。我正在寻找的是标准的一部分,它说明了类型是否相同,如果不是,编译期间模板整型参数使用了多少位。

回答

2

在这里看到:http://www.boost.org/doc/libs/1_41_0/libs/integer/integer_traits.html

编辑:其实这不是给你有关标准的任何信息,但是你可以得到编译时对于某些类型的最小值和最大值。

编辑2:根据您的更新,我建议您使用boost.mpl,boost.type_traits和前面提到的boost.integer_traits库。

Boost还提供了一个名为cstdint.hpp(boost.integer库的一部分)的头文件,它定义类似boost :: uint32_t或boost :: int32_t的类型,这将确保您获得支持32位的类型。 (当然也用于8,16和64位)

boost.type_traits例如,你可以比较两种类型,如果它们相等。你会为它使用boost::is_same

Boost MPL为您提供编译时算法,使条件等和整数特征将为您提供编译时间的方式来获得类型的限制。

HTH

+0

我已经在使用boost.mpl。如果它解决了我的问题,我还没有找到它。 integer_traits库对我来说似乎也没用,因为这些值不是整型常量表达式,所以不能在模板数学中使用。 – swestrup 2010-10-13 20:52:19

+0

boost :: integer_traits :: const_min和boost :: integer_traits :: const_max绝对是编译时常量。对于[在多种类型之间进行选择](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/type-selection.html)(或值,但它们表示为包含值(在boost.mpl中)或值[基于某些条件](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/comparisons.html)([包括逻辑运算]( http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/logical-operations.html))boost.mpl非常适合。 – Vinzenz 2010-10-13 21:07:53

+0

也有[按位操作,其他人可以看到元函数列表](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/metafunctions.html) – Vinzenz 2010-10-13 21:09:23

4

请参阅numeric limits。对于std::numeric_limits<>::digits文档说:

对于整数类型:在表示非符号位(基数基位)的数目。 对于浮点类型:尾数中的位数(以小数为基数)(等同于FLT_MANT_DIG,DBL_MANT_DIG或LDBL_MANT_DIG)。

编辑

还有其他的方法,如min()max()等。

+0

我如何知道编译时模板计算使用的int大小与运行时相同?预处理器没有。 – swestrup 2010-10-13 20:01:49

+0

@swestrup:模板引擎知道(并使用)运行时类型。预处理器没有。 – Potatoswatter 2010-10-13 20:50:35