Daily bit(e) C++. std::spanstream

Добавлено 15 августа 2026 в 08:01

Daily bit(e) C++ 78, альтернатива std::stringstream в C++23 для заимствованных непрерывных диапазонов: std::spanstream.

Daily bit(e) C++

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

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

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

#include <spanstream>
#include <vector>

// Работает как stringstream, но с заимствованным базовым диапазоном

// Парсинг текстовых данных в буферах, string_view, строковых литералах
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

// Также работает для вывода
std::vector<char> data(1024*8,'\0');
std::spanstream out(data);
out << 10 << " " << 20 << " " << 30;
// data == "10 20 30" (за которыми следуют нулевые символы)

// Следует отметить, что обработка ошибок записи является сложной задачей
std::vector<char> limited(8, '\0');
std::spanstream sstr(limited);
sstr << 1000 << " ";

auto pos = sstr.tellp(); // запомнить смещение
sstr << 1000;            // завершится неудачей (недостаточно места)
// data = "1000 100"
if (!sstr.good()) 
{
    sstr.clear();    // очистить флаги ошибок
    sstr.seekp(pos); // вернуться
}
while (sstr << 'X'); // заполнить оставшуюся часть буфера символами 'X'
// data == "1000 XXX"

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование