¿Qué es istream_view y cuándo se usa?

Dec 12 2020

Aparentemente, C ++ 20 tiene un nuevo std::istreamconstructo -related: std::istream_view. La página cppreference es un código auxiliar en este momento . Entonces, ¿qué es una "vista de un istream" y para qué puedo usarlo?


† - Ok, técnicamente redirecciona a una página sobre std::basic_istream_viewy esa es un stub.

Respuestas

3 einpoklum Dec 12 2020 at 05:32

An std::istream_view<T>es un rango ; y más específicamente, un rango formado como vista . Esta adición a la biblioteca estándar es similar a lo que puede encontrar debajo std::ranges::views, excepto que no es una vista de un rango arbitrario, sino de un std::istream.

Entonces, ¿qué "visualización" se aplica a un std::istream? Recall an istreames un flujo de caracteres , no de Telementos de tipo arbitrario de su elección. La aplicación perezosa de analizar esos caracteres en consecutivos Tes la "visualización" del istream. Es decir, el elemento k-ésimo de std::istream_view<T>(is)es lo que se obtiene el tiempo k-ésimo funcionamiento is >> tpara tel tipo T.

Utilizaría un std::istream_view(con cuidado ) cuando desee aplicar su código, que funciona con rangos, directamente a los datos de entrada, en lugar de analizar primero su entrada en una estructura de datos de una manera más "antigua" y luego trabajar en esa estructura como rango.

Otras asumen lo que std::istream_viewes:

  • @Barry ha descrito como el equivalente de una corrutina que analiza Ts de un istream; lea esta respuesta para obtener más detalles (tenga en cuenta que se trata de la vista istream en los rangos-v3, gran parte de la cual se convirtió en la biblioteca de rangos estándar).
  • @NicolBolas considera que es el resultado de "encajar std::istream_iterator<T>en una interfaz de vista C ++ 20".