随着范围合并到 C++20,我希望我们能在 C++ 中得到与 boost::irange 等效的东西,但是谷歌搜索没有找到任何东西......
我知道,std::views::iota但这并没有做同样的事情,特别是单参数重载需要开始,而不是结束。
单参数irange可以通过以下方式轻松实现views::iota:
template <std::integral I>
auto irange(I end) {
return std::views::iota(I{0}, end);
}
请注意,这irange仅适用于整数,并且iota要求其参数具有相同的符号 - 因此我们使用I{0}而不是简单0地处理无符号类型。
但是为了完整地完成irange,我们需要另一个不在 C++20 中的范围适配器:views::stride. 你可以从 range-v3 获得那个。然后将这些写成一个对象以进一步方便:
struct irange_t {
template <std::integral I>
constexpr auto operator()(I end) const {
return std::views::iota(I{0}, end);
}
template <std::integral I>
constexpr auto operator()(I begin, I end) const {
return std::views::iota(begin, end);
}
template <std::integral I, std::integral S>
constexpr auto operator()(I begin, I end, S step) const {
return std::views::iota(begin, end) | ranges::views::stride(step);
}
};
inline constexpr irange_t irange{};
boost::irangeC ++ 20中是否有等价物?
不是直接的,但很容易提供您自己的等效实用程序功能。
template<std::semiregular Bound>
auto irange(Bound b)
{
return std::ranges::iota_view(0, b);
}