Есть ли способ создать поток строк из string_view без копирования данных? - PullRequest
5 голосов
/ 23 октября 2019

Я думаю, что это довольно простой вопрос. Я бы особенно хотел использовать std::get_time, но для этого требуется какой-то поток, с которым нужно работать. Я передаю данные в string_view и хотел бы не копировать их только для анализа даты.

1 Ответ

3 голосов
/ 23 октября 2019

Это легко сделать с помощью библиотеки Boost.Iostreams:

#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

#include <iostream>
#include <string>

int main() {
    std::string_view buf{"hello\n"};
    boost::iostreams::stream<boost::iostreams::basic_array_source<char>> stream(buf.begin(), buf.size());

    std::string s;
    stream >> s;
    std::cout << s << '\n';
}

Вы можете сделать это с помощью std::stringstream и std::basic_stringbuf<CharT,Traits,Allocator>::setbuf, но с C ++Стандарт нарушил свои требования:

Эффект [из setbuf] определяется реализацией: некоторые реализации ничего не делают, в то время как некоторые реализации очищают член std::string, используемый в настоящее время в качестве буфера, и начинают использоватьпредоставленный пользователем массив символов размером n, первый элемент которого указан s в качестве буфера и последовательности символов ввода / вывода.

...