Ежедневный бит (е) C++ # 78, альтернатива C++ 23 std::stringstream для заимствованных смежных диапазонов: std::spanstream

C++23 добавил std::spanstream, фактически эквивалентный std::stringstream, работающий с заимствованным непрерывным диапазоном.

std::spanstream можно использовать для прямого анализа текста, хранящегося в необработанной памяти, строковых представлениях или строковых литералах.

При использовании std::spanstream для записи std::spanstream будет записывать столько вывода, сколько помещается в диапазон вывода, что может быть неудобно.

#include <spanstream>
#include <vector>

// Works as a stringstream, but with a borrowed underlying range

// Parsing of text data in buffers, string_views, string literals
char buffer[] = "10 20 30";
std::spanstream stream(buffer);
int a, b, c;
stream >> a >> b >> c;
// a == 10, b == 20, c == 30, stream.good() == true

// Also works for output
std::vector<char> data(1024*8,'\0');
std::spanstream out(data);
out << 10 << " " << 20 << " " << 30;
// data == "10 20 30" (followed by nul characters)

// However note that handling write errors is cumbersome
std::vector<char> limited(8, '\0');
std::spanstream sstr(limited);
sstr << 1000 << " ";

auto pos = sstr.tellp(); // remember the offset
sstr << 1000; // this fails (not enough space)
// data = "1000 100"
if (!sstr.good()) {
    sstr.clear(); // clear the error flags
    sstr.seekp(pos); // seek back
}
while (sstr << 'X'); // fill the rest of the buffer with 'X'
// data == "1000 XXX"

Откройте пример в Compiler Explorer.