【问题标题】:Is there a boost::irange equivalent in C++20? [duplicate]C++20 中是否有 boost::irange 等价物? [复制]
【发布时间】:2019-09-05 09:03:06
【问题描述】:

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

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

【问题讨论】:

  • 编写一个接受上限并返回正确初始化的std::views::iota 的实用程序不是很容易吗?
  • 对于未来的读者:这不是重复的:我要求用特定的 c++20 替代 boost:irange,而不是“循环整数范围的最简洁方法”
  • 值得注意的是,range 库引入的代码量相当可观,这可能也是 boost 的情况——所以对于更简单、定制化的代码,还有一些话要说,@ 987654323@ 实现。

标签: c++ boost c++20


【解决方案1】:

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

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

template<std::semiregular Bound>
auto irange(Bound b)
{
     return std::ranges::iota_view(0, b);
}

【讨论】:

    【解决方案2】:

    单参数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{};
    

    【讨论】:

    • range-v3 IIRC 中有一个名为 ints 的专用视图。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2013-06-21
    • 2019-02-09
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多