【问题标题】:How do I determine the number of bits in a template non-type integral constant parameter?如何确定模板非类型整数常量参数中的位数?
【发布时间】:2011-04-25 01:14:16
【问题描述】:

我认为这已包含在 C++ 标准中,但我无法找到它。我正在编写一些模板,它们将对它们的非类型整数参数进行算术运算,我发现我需要MAX_INT 等价于template <int x> Foo 等模板中的参数'x'。

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

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

【问题讨论】:

    标签: c++ templates parameters integer metaprogramming


    【解决方案1】:

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

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

    编辑

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

    【讨论】:

    • 我怎么知道编译时模板计算使用与运行时相同的 int 大小?预处理器没有。
    • @swestrup:模板引擎知道(并使用)运行时类型。预处理器没有。
    【解决方案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

    【讨论】:

    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2020-12-04
      • 2021-12-14
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多