我可以使用 std::ostream 打印到给定的缓冲区吗?

Can I use an std::ostream to print into a given buffer?

我有一个给定的字符缓冲区(甚至可能是支持 std::string 的缓冲区,但没关系)。我想使用 std::ostream 打印到该缓冲区,即我希望能够写:

span<char> my_buffer = get_buffer();
auto my_os = /* magic */;
static_assert(
   std::is_base_of<std::basic_ostream<char>,decltype(my_os)>::value,
   "magic failed");
my_os << "hello" << ',' << 123 << '[=11=]';
std::cout << my_buffer << '\n';

并得到:

hello,123

在标准输出上。

注意:C++11 如果可能,请注明您使用的语言标准。 (是的,我知道 C++11 没有跨度。)

(感谢@BoP 和@T.C。对于这个解决方案的两个部分)

这可以做到...如果您愿意使用已弃用的 C++ 构造:std:ostrstream.

#include <strstream>
#include <iostream>

int main() {
    const size_t n = 20;
    char my_buffer[n];
    std::ostrstream my_os(my_buffer, n);
    my_os << "hello" << ',' << 123 << '[=10=]';
    std::cout << my_buffer << '\n';
}

关于这段代码的注释:

  1. works (GodBolt)
  2. C++98有效! ...当然我不得不放弃 std::spanauto 类型推断等。它也是有效的 C++11 和更高版本的标准。
  3. 这将从您的字符缓冲区构造一个 std::strstreambuf,这是 std::ostrstream 直接使用的。

(see this on GodBolt)

不幸的是,随着 std::ostrstream 的弃用,我们没有 fully-valid 替代方案,包括 C++20。您需要实现自定义 std::basic_streambuf,并将其分配给 std::ostream。 :-(

但是在 C++23 - 你很幸运!标准库确实完全提供了您所要求的:std::spanstream:一个std::ostreamchar的跨度支持,它在建筑。