为什么我不能将lazy_split_view与istream一起使用而不是string_view?

问题描述 投票:0回答:1

考虑以下代码片段(改编自 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);

我想对流执行相同的操作 - 例如,

std::cin
- 而不是
text
。我试过:

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);

但这失败了

<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);
      |                           ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

为什么?

c++ istream std-ranges c++23 istream-iterator
1个回答
1
投票

虽然

views::lazy_split
支持
input_range
,但由于后者是单遍范围,因此一旦迭代就无法返回到前一个元素。在这种情况下,模式范围必须是
tiny-range
,这意味着它的大小必须小于或等于1。

你最多能做的是:

std::ranges::for_each(
  std::views::istream<char>(std::cin) | std::views::lazy_split('+'),
  act_on_substring
});

演示

© www.soinside.com 2019 - 2024. All rights reserved.