【发布时间】:2016-07-25 15:05:32
【问题描述】:
给定任何(有符号或无符号)整数类型T,我如何在编译时最好地确定任何base > 0 中其字符串表示形式(包括符号)的最大字符数?
template <typename T>
constexpr auto getMaxLengthAsString(std::uintmax_t base)
-> /* std::uintmax_t ??? */
{ /* ??? */ }
这在一些必须预先分配字符串并且不允许在转换过程中抛出任何异常的情况下很有用。其有用性的一个简短示例如下:
template <typename T>
void examplePrintValue(T value) noexcept {
constexpr static auto const maxLen = getMaxLengthAsString<T>(10);
/* Ignoring thread safety etc to keep this example short: */
static char buffer[maxLen + 1u];
buffer[maxLen] = '\0';
/* ... real conversion of value to buffer happens here ... */
cout << buffer << endl;
}
【问题讨论】:
-
到目前为止你做了什么?
-
您可以预先计算它并从 sizeof() 每个基数中获得一个静态数组位数
-
假设你想出了一些东西。如果您的解决方案不是 100% 完美怎么办? IMO,尝试计算要分配多少的确切字节数是危险的。你正在表演一场高空表演。
-
@SergeyA 好吧,对于无符号类型来说,这很容易,因为我们可以用
uintmax_t来做事。当T是有符号整数类型并且numeric_limits<T>::min()不能以常规方式与uintmax_t base的否定进行比较时,事情变得更加复杂,因为-base不能用类型T或intmax_t表示。 Afaik-numeric_limits<T>::min()的结果甚至可能无法在uintmax_t中表示,因为标准不保证有符号类型的最负值的否定可以使用相应的无符号类型或uintmax_t来表示。跨度> -
CHAR_BIT是一个宏,定义为char中的位数。不过没关系,我误读了这个问题
标签: c++ c++11 integer base constexpr