在基于范围的for循环中访问指针

3
我有一个动态数组包装模板,类似于这样:
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循环一样工作。


你可以从引用中获取指针。 - Daniel
你的意思是这样的吗:for(auto& ref : wrapper) { auto ptr = &ref; }?我能否以某种方式修改begin()end()方法,使其在for(auto ptr : wrapper) { /* do smth */ }中隐式地工作? - Yuri Lifanov
1个回答

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 函数返回该迭代器。

我认为这对于一个数组包装器来说是有点令人惊讶的行为。

演示实况


看起来很不错。谢谢。数组包装器只是一个最简单的例子。 - Yuri Lifanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接