我实现了一个适配器范围的迭代器,它可以懒惰地评估原始范围内的某些东西。这意味着:取消引用迭代器应取消引用底层迭代器并对结果应用一些操作,然后返回该操作的结果。
T operator*() const {
return someOperation(*original_iterator);
}
如何实施与operator->
类似的operator*
?在查看其他迭代器的实现时,它们通常会返回T*
。但是我无法返回一个指针,因为"指向了对象"是一个临时的,即时计算。
在这种情况下通常的指导是什么?我可以简单地返回T
吗?
虽然我个人不需要此操作符(我也可以使用(*i).m
代替i->m
,标准算法似乎不依赖于->
),我喜欢我的迭代器严格遵守 ForwardIterator
概念,InputIterator
是{{3}}的特殊化,需要实现此运算符。
答案 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);
}
};
这取决于箭头操作符被链接的事实,即如果一个箭头操作符返回不是原始指针的东西,则依次调用箭头操作符,直到找到指针。