如何在两个 C++20 范围上实现延迟计算的函数?

Ani*_*ury 7 c++ lazy-evaluation range-v3 c++20

zip_withEric Niebler 提供了一个函数。

但是,既然 C++20 支持范围,我想构建类似的东西。

这个问题filter,并transform为他们迭代的范围?

我该怎么做呢?我已经坚持了一段时间,并且不愿意使用表达式模板。

例如,假设我有两个向量 M1{1,2,3} 和 M2{4,5,6}。

我想使用范围库来重载运算符以返回包含这两个矩阵相加的视图 - M1+M2 := {5,7,9}

使用 range-v3,我可以执行 auto sum = zip_with(std::plus,M1,M2);

上面的表达式是惰性求值的。如何使用 C++20 范围重新创建此表达式?

Oli*_*liv 2

这个原理非常简单。创建一个迭代器,为每个向量存储一个迭代器,当递增时,递增两个存储的迭代器,并且仅在取消引用时才进行加法。

这是一段体现原理的代码:

template <class It1, class It2>
struct adder_iterator{
  It1 it1;
  It2 it2;

  decltype(auto)
  operator++(){
    ++it1; ++it2;
    return *this;
    }

  auto
  operator *()const{
    return *it1+*it2;
    }
  //....
  };
Run Code Online (Sandbox Code Playgroud)

您还需要实现一个哨兵和一个视图(通过派生自std::view_interface)。

哨兵就是end迭代器。您可以使用该类adder_iterator来实现此目的。但是您可以考虑优化:在视图构造函数中,确保最短的向量开始迭代器始终是 it1 end,然后仅使用此迭代器来测试迭代的结束。你应该尝试看看。