我喜欢 C++ 在 C++20 中获得的新范围功能(以及 C++23 中的更多功能)。假设我想将其中一些与
std::cin
一起使用,或者使用我打开的一些 std::fstream
。我该怎么做?
为了使问题更加具体,请考虑以下代码片段(改编自 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);
如果我想对
text
采取行动而不是 std::cin
,我该怎么写?我需要创建一些 std::istream_iterator
,还是可以用更简单的方法来实现?
虽然
views::lazy_split
支持输入范围,但在这种情况下,它的模式必须是tiny-range
,这意味着模式的大小必须小于或等于1。
所以你最多能做的是:
std::ranges::for_each(
std::views::istream<char>(std::cin) | std::views::lazy_split('+'),
act_on_substring
});