Qu'est-ce qu'un istream_view et quand en utiliser un?

Dec 12 2020

Apparemment, C ++ 20 a une nouvelle std::istreamconstruction concernant la PI: std::istream_view. La page cppreference dessus est un stub pour le moment . Alors, qu'est-ce qu'une «vue d'un istream» et à quoi puis-je l'utiliser?


† - Ok, techniquement, il redirige vers une page sur std::basic_istream_viewet celle-là est un stub.

Réponses

3 einpoklum Dec 12 2020 at 05:32

An std::istream_view<T>est une plage ; et plus précisément, une plage formée comme une vue . Cet ajout à la bibliothèque standard ressemble à ce que vous pourriez trouver sous std::ranges::views- sauf qu'il ne s'agit pas d'une vue d'une plage arbitraire, mais d'un fichier std::istream.

Alors, quelle "visualisation" est appliquée à un std::istream? Rappelez-vous que un istreamest un flux de caractères , pas d' Téléments de type arbitraire de votre choix. L'application paresseuse de l'analyse de ces caractères en consécutifs Test la "visualisation" du flux istream. C'est l'élément de kème std::istream_view<T>(is)est ce que vous obtenez le temps de kème en cours d' exécution is >> tpour tle type T.

Vous utiliseriez un std::istream_view( soigneusement ) lorsque vous souhaitez appliquer votre code, qui fonctionne avec des plages, directement aux données d'entrée - plutôt que d'analyser d'abord votre entrée dans une structure de données d'une manière plus "old-school", puis de travailler sur cette structure comme une gamme.

D'autres interprétations de ce qu'est un std::istream_view:

  • @Barry a décrit comme l'équivalent d'une coroutine qui analyse Ts d'un istream; lisez cette réponse pour plus de détails (notez qu'il s'agit de la vue istream dans les gammes-v3, dont une grande partie est devenue la bibliothèque de gammes standard).
  • @NicolBolas le considère comme le résultat d'un "encapsulation std::istream_iterator<T>dans une interface de vue C ++ 20".