簡體   English   中英

我可以使用 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 << '\0';
std::cout << my_buffer << '\n';

並得到:

hello,123

在標准輸出上。

注意:如果可能,請使用 C++11,並請提及您使用的語言標准。 (是的,我知道 C++11 沒有跨度。)

(感謝@BoP 和@TC 提供此解決方案的兩個部分)

這可以做到……如果您願意使用已棄用的 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 << '\0';
    std::cout << my_buffer << '\n';
}

關於此代碼的注釋:

  1. 有效(GodBolt)
  2. 它是有效的 C++98! ...當然我不得不放棄std::spanauto類型推斷等。它也是有效的 C++11 和更高版本的標准。
  3. 這將從您的字符緩沖區構造一個std::strstreambuf ,這是std::ostrstream直接使用的。

在 GodBolt 上看到這個

不幸的是,隨着std::ostrstream的棄用,我們沒有完全有效的替代方案,包括 C++20。 您需要實現自定義std::basic_streambuf ,並將其分配給std::ostream :-(

但是在C++23中——你很幸運! 標准庫確實提供了您所要求的內容: std::spanstream char跨度支持的std::ostream ,它在構造時給出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM