0

是否可以在类内部使用视图来实现 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) { ... }
4

1 回答 1

0

看起来这样做是安全的,但只存储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);
于 2018-02-23T11:10:27.373 回答