[英]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';
}
關於此代碼的注釋:
std::span
、 auto
類型推斷等。它也是有效的 C++11 和更高版本的標准。std::strstreambuf
,這是std::ostrstream
直接使用的。 不幸的是,隨着std::ostrstream
的棄用,我們沒有完全有效的替代方案,包括 C++20。 您需要實現自定義std::basic_streambuf
,並將其分配給std::ostream
。 :-(
但是在C++23中——你很幸運! 標准庫確實提供了您所要求的內容: std::spanstream
:由char
跨度支持的std::ostream
,它在構造時給出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.