constexpr log10整数函数

时间:2018-10-01 12:40:37

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

因此,我需要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]
是否已经为此提供了工具,还是必须定义自己的工具?

2 个答案:

答案 0 :(得分:4)

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

  

std :: numeric_limits :: max_digits10的值是唯一表示T类型的所有不同值所必需的以10为基数的数字。

     

std :: numeric_limits :: digits10的值是类型T可以表示的以10为基数的位数,而无需更改,即,具有这么多有效十进制数字的任何数字都可以转换为。输入T并返回十进制格式,由于四舍五入或溢出而不会更改。

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

答案 1 :(得分:1)

std::log10必须 constexpr

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