如何确定模板非类型积分常量参数中的位数?

时间:2010-10-13 19:44:16

标签: c++ templates parameters integer metaprogramming

我认为这在C ++标准中有所涉及,但我无法找到它。我正在编写一些模板,这些模板将对其非类型积分参数进行算术运算,我发现在MAX_INT这样的模板中我需要等效template <int x> Foo参数'x'。

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

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

3 个答案:

答案 0 :(得分:4)

numeric limitsstd::numeric_limits<>::digits的文档说:

  

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

修改

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

答案 1 :(得分:3)

您需要numeric_limit类http://www.cplusplus.com/reference/std/limits/numeric_limits/

具体地,

numeric_limits<T>::max()

将根据T为您提供CHAR_MAX,SCHAR_MAX,UCHAR_MAX,SHRT_MAX,USHRT_MAX,INT_MAX,UINT_MAX,LONG_MAX,ULONG_MAX,FLT_MAX,DBL_MAX或LDBL_MAX。

答案 2 :(得分:2)

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

编辑:实际上它没有提供有关标准的任何信息,但是您可以在某些类型的编译时获得最小值和最大值。

Edit2:根据您的更新,我建议您使用boost.mplboost.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