我有一個給定的字符緩沖區(甚至可能是支持 a 的緩沖區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 沒有跨度。)
uj5u.com熱心網友回復:
(感謝@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';
}
關于此代碼的注釋:
- 它有效(GodBolt)
- 它是有效的 C 98!...當然我不得不放棄
std::span,auto型別推斷等。它也是有效的 C 11 和更高版本的標準。 - 這將從您的字符緩沖區構造 an
std::strstreambuf,這是 an直接使用的內容。std::ostrstream
(在 GodBolt 上看到這個)
不幸的是,隨著 的棄用std::ostrstream,我們沒有完全有效的替代方案,包括 C 20。您需要實作一個自定義std::basic_streambuf,并將其分配給一個std::ostream. :-(
但是在C 23中——你很幸運!標準庫確實提供了您所要求的內容:std::spanstream: Astd::ostream由 's 的跨度支持char,它在構造時給出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488662.html
下一篇:WSL2Nginx PHPFPM在連接到上游時失敗(111:連接被拒絕),客戶端:172.23.0.1,上游:“fastcgi://172.23.0.3:9001”
