Considere este trecho de código (adaptado de cppreference.com):
constexpr std::string_view text{"Hello-+-C++-+-23-+-!"};
constexpr std::string_view delim{"-+-"};
std::ranges::for_each(text | std::views::lazy_split(delim), act_on_substring);
Quero fazer o mesmo para um fluxo - digamos, std::cin
- em vez de text
. Eu tentei:
auto isv = std::views::istream<std::string>(std::cin);
constexpr std::string_view delim{"-+-"};
std::ranges::for_each(isv | std::views::lazy_split(delim), act_on_substring);
Mas este código não consegue compilar :
<source>:21:31: error: invalid operands to binary expression ('basic_istream_view<basic_string<char, char_traits<char>, allocator<char>>, char, char_traits<char>>' and '_Partial<_LazySplit, decay_t<const basic_string_view<char, char_traits<char>> &>>' (aka '_Partial<std::ranges::views::_LazySplit, std::basic_string_view<char, std::char_traits<char>>>'))
21 | std::ranges::for_each(isv | std::views::lazy_split(delim), act_on_substring);
| ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
por que?
Embora
views::lazy_split
suporteinput_range
, como o último é um intervalo de passagem única, não há como voltar ao elemento anterior depois de iterado. Neste caso, o intervalo do padrão deve ser atiny-range
, o que significa que seu tamanho deve ser menor ou igual a 1.O máximo que você pode fazer é:
Demonstração