What
ranges::istream_view<int>(input)
所做的就是生成一个大致相当于此协程的范围(即使您不了解 C++20 协程,希望这个示例足够简单,足以说明问题):
generator<int> istream_view_ints(istream& input) {
int i;
while (input >> i) { // while we can still stream int's out
co_yield i; // ... yield the next int
}
}
这里有两个重要的点:
- 这是范围
int
s,所以你不能split
它在一根绳子上。
- 这使用普通流
>>
,它不允许您提供自己的分隔符 - 它仅在空格处停止。
共,istream_view<int>(input)
给你一系列int
在您的输入中,包含一个int
: just 42
。下一个输入将尝试读入,
并失败。
为了获得分隔输入,您可以使用getlines
。这将为您提供一系列string
与您提供的分隔符。它用std::getline内部。实际上,它就是这个协程:
generator<string> getlines(istream& input, char delim = '\n') {
string s;
while (std::getline(input, s, delim)) {
co_yield s;
}
}
然后你需要转换这些string
s to int
s。像这样的事情应该可以解决问题:
auto ints = ranges::getlines(input, ',')
| ranges::view::transform([](std::string const& s){ return std::stoi(s); });