【问题标题】:Access pointer in range based for loop基于for循环的范围内的访问指针
【发布时间】:2016-10-13 19:29:05
【问题描述】:

我有一个像这样的动态数组包装模板:

class Wrapper {
  public:
    T* const start;
    T* const end;
    T* begin() const { return start; }
    T* end() const { return end; }
    /*
       more code
    */
};

通过循环提供值和引用访问:

Wrapper<T> wrapper;
for(auto val : wrapper) {
  //do smth to value
}
for(auto& ref : wrapper) {
  //do smth to reference
}

。我现在想创建一个基于范围的 for 循环,它等同于:

for(auto ptr = wrapper.start; ptr != wrapper.end; ptr++) {
  //do smth to pointer
}

,即我想要一个基于范围的循环包装器来访问指针。有没有办法做到这一点,而无需在我的包装器内创建指向指针的指针数组?

编辑

Dani 在评论中的解决方案正如here 所指出的那样有效。我实际上想知道是否有办法制作以下语法:

for(auto ptr : wrapper) {
  //do smth
}

作为上述 C 风格的 for 循环工作。

【问题讨论】:

  • 你可以从引用中获取指针
  • 您的意思是:for(auto&amp; ref : wrapper) { auto ptr = &amp;ref; }?我可以以某种方式更改 begin()end() 方法以使其在以下位置隐式工作:for(auto ptr : wrapper) { /* do smth */ } 吗?

标签: c++ c++11 for-loop


【解决方案1】:

您可以编写自己的自定义迭代器,在取消引用时返回 T*

class iterator {
    T* ptr;
public:
    explicit iterator(T* ptr) : ptr(ptr) {}
    iterator& operator++() {ptr++; return *this;}
    bool operator!=(iterator other) const {return ptr != other.ptr;}
    T* operator*() const {return ptr;}
};

然后从您的 beginend 函数返回这个迭代器。

我认为数组包装器的行为有点令人惊讶。

Live demo.

【讨论】:

  • 看起来不错。谢谢。数组包装器只是一个小例子。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
相关资源
最近更新 更多