【问题标题】:constexpr log10 Function for Integersconstexpr log10 整数函数
【发布时间】:2019-03-06 13:55:12
【问题描述】:

所以我需要log10 功能来查找存储给定整数所需的字符数。但我想在编译时得到它,以根据我的代码中定义的这些整数常量静态确定 char 数组的长度。不幸的是 log10 不是 constexpr 函数,即使是整数版本。我可以制作这样的完整版本:

template <typename T>
constexpr enable_if_t<is_integral_v<T>, size_t> intlen(T param) {
    size_t result{ 1U };

     while(T{} != (param /= T{ 10 })) ++result;
     return result;
}

这最终将允许我这样做:const char foo[intlen(13) + 1U]
是否已经为此提供了一个工具,还是我必须自己定义?

【问题讨论】:

  • 你的问题到底是什么?
  • @DanM。 “c++ 是否已经为此提供了一个工具,还是我必须自己定义?”
  • const char foo [] = "13" 有什么问题?这会将foo 初始化为三个char 的数组,而无需输入两次13
  • @Peter:更好的例子可能是:char buffer[intlen(UINT_MAX)+1u];,它创建了一个足够大的缓冲区来容纳任何无符号整数。
  • @Peter:好的,这对于 UINT_MAX(和类似变量)的 特定 示例来说很好,但是如果您有其他限制,则能够创建适当大小的缓冲区很有用。 (反对票 - 他们已经消失了。当时是 -2)。

标签: c++ c++ constexpr c-strings string-length logarithm


【解决方案1】:

如果您只想获取给定整数(和浮点)类型(不是特定值,即对所有值都足够)的最大位数(base10),您可以使用:std::numeric_limits::max_digits10std::numeric_limits::digits10

std::numeric_limits::max_digits10 的值是唯一表示 T 类型的所有不同值所必需的 base-10 位数

std::numeric_limits::digits10 的值是类型 T 可以不加变化地表示的 base-10 位数,即任何具有这么多有效十进制数字的数字都可以转换为键入 T 并返回十进制形式,不会因四舍五入或溢出而改变。

但是,如果您想查找特定常量的constexpr“长度”,则必须使用您的自定义函数。

【讨论】:

  • 请注意,max_digits10 仅对浮点类型有意义,对整数类型无效。
【解决方案2】:

std::log10 按照标准必须是no constexpr

由于没有 constexpr 替代方案,您必须编写自己的版本(或使用提供版本的库)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2012-06-28
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多