如何确定模板非类型整型常量参数中的位数? 我假设这是在C++标准中所涵盖的,但我一直没有找到。我正在编写一些模板,这些模板将对它们的非类型整数参数进行算术运算,我发现在像template Foo这样的模板中,我需要与参数“x”等价的MAX_INT

如何确定模板非类型整型常量参数中的位数? 我假设这是在C++标准中所涵盖的,但我一直没有找到。我正在编写一些模板,这些模板将对它们的非类型整数参数进行算术运算,我发现在像template Foo这样的模板中,我需要与参数“x”等价的MAX_INT,c++,templates,parameters,integer,metaprogramming,C++,Templates,Parameters,Integer,Metaprogramming,理想情况下,有人可以给我指出标准中的段落(如果有),该段落给出了整数模板参数大小的允许范围,以及确定特定实现上的实际位数的任何方法 -- 澄清一下:作为元编程库的一部分,它是在类型系统中进行数学运算的模板。“int”永远不会被实例化,也永远不会占用运行时存储空间。在许多方面,它类似于预处理器所做的数学运算,在这种情况下,我知道整数类型不能保证与“int”的大小相同。我要寻找的是标准中的一部分,该部分说明了类型是否相同,如果不相同,编译过程中模板积分参数使用了多少位。请参阅。std::numeri

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

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

请参阅。
std::numeric\u limits::digits
的文档说明:

对于整数类型:表示法中的非符号位(基数数字)的数量。 对于浮动类型:尾数中的位数(基数)(相当于FLT_MANT_DIG、DBL_MANT_DIG或LDBL_MANT_DIG)

编辑

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

请参见此处:

编辑:实际上它没有给你任何关于标准的信息,但是你可以在编译时得到特定类型的最小值和最大值

编辑2:根据您的更新,我可以建议您使用,以及前面提到的库

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

例如,您可以使用比较两种类型是否相等。你会用它的

boostmpl为您提供编译时算法、生成条件等,integer traits将为您提供一种获得类型限制的编译时方法


HTH

您需要数字限制类

具体来说,

numeric_limits<T>::max()
numeric_limits::max()

将为您提供CHAR_MAX、SCHAR_MAX、UCHAR_MAX、SHRT_MAX、USHRT_MAX、INT_MAX、UINT_MAX、LONG_MAX、ULONG_MAX、FLT_MAX、DBL_MAX或LDBL_MAX,具体取决于T.

如何知道编译时模板计算使用与运行时相同大小的INT?预处理器没有。@swestrup:模板引擎知道(并使用)运行时类型。预处理器没有。我已经在使用boost.mpl了。如果它解决了我的问题,我还没有找到它。integer_traits库对我来说似乎也没用,因为生成的值不是整数常量表达式,因此不能用于模板数学。boost::integer_traits::const_min和boost::integer_traits::const_max绝对是编译时常量。For(或值,但它们表示为在boost.mpl中包含值的类型)或values()boost.mpl非常适合