考虑以下代码片段(改编自 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);
| ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为什么?
虽然
views::lazy_split
支持input_range
,但由于后者是单遍范围,因此一旦迭代就无法返回到前一个元素。在这种情况下,模式范围必须是 atiny-range
,这意味着它的大小必须小于或等于 1。你最多能做的是:
演示