c++ - 使用即时计算的临时值为 ForwardIterator 实现成员访问运算符->

标签 c++ iterator operator-overloading

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

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

如何实现类似于此 operator*operator->?在查看其他迭代器的实现时,它们通常返回一个 T*。但是我不能返回一个指针,因为“指向对象”是一个临时的、即时计算的。

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

虽然我个人不需要这个运算符(我也可以使用 (*i​​).m 而不是 i->m 并且标准算法不需要似乎也依赖于 ->),我希望我的迭代器严格符合 ForwardIterator概念是InputIterator的特化这需要实现此运算符。

最佳答案

最简单的方法是只使用 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);
  }
};

这依赖于箭头运算符被链接的事实,即如果一个箭头运算符返回不是原始指针的东西,箭头运算符将依次调用那个东西,直到你得到一个指针。

关于c++ - 使用即时计算的临时值为 ForwardIterator 实现成员访问运算符->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495962/

相关文章:

c++ - 评估这个的顺序是什么?为什么? C++

C# 指针、迭代器和泛型

c++ - 如何编写 operator== 以使用隐式转换/构造类型

C++运算符重载和用法

c++ - 错误 : Label used but not defined when using && operator

c++ - 无效密文异常

c++ - pthread 中的 undefined reference

java - 切换连续列表元素的正确迭代器方法

c++ - 如何删除C++中的变量

java - 使用迭代器迭代列表并比较连续元素