2

随着范围合并到 C++20,我希望我们能在 C++ 中得到与 boost::irange 等效的东西,但是谷歌搜索没有找到任何东西......

我知道,std::views::iota但这并没有做同样的事情,特别是单参数重载需要开始,而不是结束。

4

2 回答 2

1

单参数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{};
于 2019-09-05T12:14:24.240 回答
1

boost::irangeC ++ 20中是否有等价物?

不是直接的,但很容易提供您自己的等效实用程序功能。

template<std::semiregular Bound>
auto irange(Bound b)
{
     return std::ranges::iota_view(0, b);
}
于 2019-09-05T09:14:04.180 回答