O que é istream_view e quando devo usá-lo?

Dec 12 2020

Aparentemente, C ++ 20 tem um novo std::istreamconstructo -relacionados: std::istream_view. A página cppreference é um esboço agora . Então, o que é uma "visão de um istream" e para que posso usá-lo?


† - Ok, tecnicamente ele redireciona para uma página sobre std::basic_istream_viewe essa é um esboço.

Respostas

3 einpoklum Dec 12 2020 at 05:32

Um std::istream_view<T>é um intervalo ; e mais especificamente, um intervalo formado como uma vista . Este acréscimo à biblioteca padrão é semelhante ao que você pode encontrar em std::ranges::views- exceto que não é uma visualização de um intervalo arbitrário, mas de um std::istream.

Então, qual "visualização" é aplicada a um std::istream? Lembre-se de um istreamé um fluxo de caracteres , não de Telementos do tipo arbitrário de sua escolha. A aplicação preguiçosa de analisar esses caracteres em consecutivos Té a "visualização" do istream. Ou seja, o elemento k'th de std::istream_view<T>(is)é o que você deseja obter o tempo k'th correndo is >> tpara tdo tipo T.

Você usaria um std::istream_view(com cuidado ) quando quiser aplicar seu código, que funciona com intervalos, diretamente aos dados de entrada - em vez de primeiro analisar sua entrada em alguma estrutura de dados de uma maneira mais "tradicional" e, em seguida, trabalhar nessa estrutura como um intervalo.

Outro assume o que std::istream_viewé:

  • @Barry foi descrito como o equivalente a uma co-rotina que analisa Ts de um istream; leia esta resposta para obter detalhes (observe que é sobre a visualização istream no ranges-v3, muitos dos quais se tornaram a biblioteca de intervalos padrão).
  • @NicolBolas considera que é o resultado do "envolvimento std::istream_iterator<T>em uma interface de visualização C ++ 20".