实施成员访问操作员 - >对于具有即时计算临时值的ForwardIterator

时间:2014-10-21 20:44:49

标签: c++ iterator operator-overloading

我实现了一个适配器范围的迭代器,它可以懒惰地评估原始范围内的某些东西。这意味着:取消引用迭代器应取消引用底层迭代器并对结果应用一些操作,然后返回该操作的结果。

T operator*() const {
    return someOperation(*original_iterator);
}

如何实施与operator->类似的operator*?在查看其他迭代器的实现时,它们通常会返回T*。但是我无法返回一个指针,因为"指向了对象"是一个临时的,即时计算。

在这种情况下通常的指导是什么?我可以简单地返回T吗?

虽然我个人不需要此操作符(我也可以使用(*i).m代替i->m,标准算法似乎不依赖于-> ),我喜欢我的迭代器严格遵守 ForwardIterator概念,InputIterator是{{3}}的特殊化,需要实现此运算符。

1 个答案:

答案 0 :(得分:5)

最简单的方法是使用Boost.Iterators来实现迭代器,它会处理棘手的代码。

但Boost.Iterators使用的技术并不复杂。它看起来像这样:

template <typename T>
class proxy_holder {
  T t;
public:
  proxy_holder(const T& t) : t(t) {}
  T* operator ->() const { return &t; }
};

class the_iterator {
  // ...
  proxy_holder<my_proxy> operator ->() const {
    return proxy_holder<my_proxy>(**this);
  }
};

这取决于箭头操作符被链接的事实,即如果一个箭头操作符返回不是原始指针的东西,则依次调用箭头操作符,直到找到指针。