![](/img/trans.png)
[英]range-v3: Adapting custom classes which already implement iterator interfaces (begin/end)
[英]Using a range-v3 view to implement begin()/end() methods
是否可以在类内部使用视图来实现begin()/ end()方法?
例如,我想使以下类可迭代; 每次迭代时,都会在两个可迭代对象的当前元素上调用op
。
template <typename It1, typename It2, typename Op>
struct binary_op {
binary_op(It1 const& f, It2 const& s, Op o): first{f}, second{s}, op{o} {}
It1 first;
It2 second;
Op op;
};
感谢range-v3,我可以使用zip_with
视图(代码未经测试!)
ranges::view::zip_with(op, first, second);
但是我可以使用此视图实现begin()/ end()方法吗?
using namespace ranges;
template <typename It1, typename It2, typename Op>
struct binary_op {
...
auto begin() const {
return view::zip_with(op, first, second).begin();
}
auto end() const {
return view::zip_with(op, first, second).end();
}
};
可以安全地比较两个迭代器(开始和结束)吗?
我要实现的最终结果是可以嵌套任意数量的binary_op:
std::vector<int> v1, v2, v3;
auto r = binary_op(
binary_op(v1, v2, [](int a, int b) {return a + b;}),
v3,
[](int a, int b) {return a - b;});
for (auto x : r) { ... }
看起来这样做是安全的,但是只存储zip_with_view<...>
而不用为binary_op
烦恼可能更容易。
请注意,您的示例不是合法的C ++,因为lambda表达式产生的是对象,而不是类型。 你需要
auto op1 = [](int, int) -> int {/*one thing*/};
auto op2 = [](int, int) -> int {/*other thing*/};
auto r = binary_op<
binary_op<decltype(v1), decltype(v2), decltype(op1)>
decltype(v3),
decltype(op2)>{ { v1, v2, op1 }, v3, op2 };
在那一点上你也应该
auto r = view::zip_with(op2,
view::zip_with(op1, v1, v2),
v3);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.