繁体   English   中英

使用range-v3视图实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM