【问题标题】:Why is std::back_inserter_iterator not WeaklyIncrementable in RangeV3?为什么 std::back_inserter 迭代器在 Range 3 中不能弱增量?
【发布时间】:2019-10-27 12:58:54
【问题描述】:

令我惊讶的是,这个类似概念的断言在 RangeV3 中失败

#include<vector>
#include<range/v3/algorithm/copy.hpp>
int main(){
   static_assert(ranges::WeaklyIncrementable<std::back_insert_iterator<std::vector<double> >>());
}

这是为什么呢?

这意味着我不能像使用std::copy 那样使用ranges::copy 算法。

    std::vector<double> w(100);
    std::vector<double> v;
    ranges::copy(
        begin(w), end(w),
        std:back_inserter(v)
    );  // compilation error, concept not fulfilled.

这是在 RangesV3 中 back_insert 的规范方式吗?


我在 RangeV3 中找不到 WeaklyIncrementable 文档,但在 cppreference https://en.cppreference.com/w/cpp/experimental/ranges/iterator/WeaklyIncrementable 中似乎有一个“签名的不同类型”可能没有为 back_inserter_iterator 定义。这可能意味着 1 或 3 件事,a) RangeV3 过度约束 copy 要求 b) copy 不是反向插入的算法,c) 我不知道如何使用 RangeV3。


找到这个https://github.com/ericniebler/range-v3/issues/867,一个可能的解决方法是使用range::back_inserter(v) 而不是std::back_inserter(v)。似乎某处有默认的可构造性要求。

【问题讨论】:

    标签: c++11 insert iterator c++-concepts range-v3


    【解决方案1】:

    看起来ranges::copy 需要一些意想不到的(对我而言)需求。 因此 RangesV3 提供了替代 ranges::back_inserter 的功能。

    但是,标准中还有许多其他迭代器由于相同的原因无法正常工作,但没有直接替代品,因此它可能会变得丑陋。

    例如,我必须调整一个新的迭代器来替换 std::ostream_iterator 创建一些人工函数,包括一个默认构造函数:

    template<class T>
    struct ranges_ostream_iterator : std::ostream_iterator<T>{
        using std::ostream_iterator<T>::ostream_iterator;
        ranges_ostream_iterator() : std::ostream_iterator<T>{std::cout}{} // I have to put something here
        ranges_ostream_iterator& operator++(){std::ostream_iterator<T>::operator++(); return *this;}
        ranges_ostream_iterator& operator++(int){return operator++();}      
        using difference_type = int;
        int operator-(ranges_ostream_iterator const&){return 0;}
    };
    

    有了这个,ranges::copy(first, last, ranges_ostream_iterator&lt;int&gt;(std::cout)) 工作,而 ranges::copy(first, last, std::ostream_iterator&lt;int&gt;(std::cout)) 不工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 2011-04-16
      • 1970-01-01
      • 2014-06-11
      • 2021-10-27
      • 1970-01-01
      • 2013-08-24
      • 2011-02-05
      相关资源
      最近更新 更多