strprintf - 此实现是否安全且可移植?

strprintf - is this implementation safe and portable?

我正在考虑在我们的项目中提出以下作为 sprintf/snprintf 的替代方案。

这样做的目的是消除考虑缓冲区大小的需要,并尽可能保持原始的便利性。

std::string strprintf(const char *format, ...)
{
    std::string s;
    s.resize(128); // best guess
    char *buff = const_cast<char *>(s.data());

    va_list arglist;
    va_start(arglist, format);
    auto len = vsnprintf(buff, 128, format, arglist);
    va_end(arglist);

    if (len > 127)
    {
        va_start(arglist, format);
        s.resize(len + 1); // leave room for null terminator
        buff = const_cast<char *>(s.data());
        len = vsnprintf(buff, len+1, format, arglist);
        va_end(arglist);
    }
    s.resize(len);
    return s; // move semantics FTW
}

此代码是否存在任何固有问题?

用法示例:

auto s = strprintf("Hello %d world", 777);

原来这里已经有很多讨论了:

std::string formatting like sprintf

主观上,我的版本看起来仍然比那里的大多数内容更简洁,但它在功能上与该线程上提出的一些解决方案相同。