c++ 是否有一个不使用预处理器的数值常量字符串长度的常量表达式?

xcitsw88  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(124)

给定一个数值常量,如UINT64_MAX,十进制字符串长度的常量表达式是什么(例如 *,“18446744073709551615”)?
下面是一个使用预处理器将常量字符串化的例子:

#define stringify(x) #x
constexpr size_t maxlen {std::char_traits<char>::length(stringify(UINT64_MAX))};

是否有一个常量表达式 * 不 * 使用预处理器?
std::numeric_limits<T>看起来应该会有所帮助,但是

#include <iostream>
#include <limits>

int main()
{
    std::cout << std::numeric_limits<uint64_t>::digits10 << std::endl;
    std::cout << std::numeric_limits<uint64_t>::max_digits10 << std::endl;
}

印刷品

19
0

目前尚不清楚std::numeric_limits<uint64_t>::digits10 + 1是否是该问题的通用解决方案。

gzszwxb4

gzszwxb41#

或许可以这样说:

template <typename T>
constexpr size_t intlog10(T n) {
    size_t count = 0;
    while (n) {++count; n /= 10;}
    return count;
}

constexpr size_t maxlen=intlog10(UINT64_MAX);

Demo

相关问题