Ежедневный бит (е) 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"