用于隐藏结构细节的迭代器适配器



假设我们有以下内容:

struct MyClass {
   typedef vector<MyValue> InnerVector;
   const InnerVector & get() { ... }
};
vector<MyClass> classes;

有没有办法在classes上提供一个"扁平化"迭代器?那就是查看classes,就好像它是一些InnerVector列表一样。迭代器的每次取消引用都应返回一个InnerVector。如下所示:

auto all_inner_vectors = magic_iterator(classes);
for (auto inner_vector : all_inner_vectors) {
  ...
}

似乎提升迭代器适配器在这里可能很方便。但是我无法弄清楚什么适配器适合这个目的。

使用 range-v3,您可以这样做

for (MyValue& value : myClass.get() | ranges::view::join) {
    // ...
}

或者,您可以将类更改为直接使用 join:

struct MyClass {
   using InnerVector = vector<MyValue>;
   // Return a range of MyValue.
   auto get() { return InnerVector | ranges::view::join; }
};

然后

for (MyValue& value : myClass.get()) {
    // ...
}

最新更新