如何让我自己编写的迭代器支持 ->?

How do I let my self-written iterator support ->?

本文关键字:支持 gt 迭代器 我自己      更新时间:2023-10-16

我正在用c++编写我自己的迭代器:

class my_iterator {
  entity operator*() {
    ...
  }
  my_iterator& operator++() {
    ...
  }
}

可以使用*操作符解引用实体。但是,我可以让我的自定义迭代器支持->操作(后跟解引用实体的一些属性或方法)吗?

是否有特定的运算符可以实现来支持-> ?

是的,如果你想要特殊的行为,你可以重载->,否则你会得到它在指针上的标准行为。

对于您的情况,您可以使用

entity* operator->() {
    return ptr_to_entity;
}

这有点奇怪,因为使用->,您的重载返回一个指向对象的指针,然后在该对象上使用->

例如:

my_iterator_instance->foo === ptr_to_entity->foo

是的,它叫做操作符->。但请记住operator->是特殊的,它应该返回一个指针,而常规的operator->将应用于该指针。鉴于上面的代码,我不能告诉你如何实现它。如果你能把接线员的详细信息填出来,我也许能给你更多的帮助。

可能是这样的。

entity* operator->() {
    ...
}

看看这个答案:重载的常用操作符。你可以跳到"类指针类型的操作符"来找到你想要的

操作符重载的摘录

我强烈建议你阅读以上内容,因为它写得很好

  Operators for Pointer-like Types

要定义自己的迭代器或智能指针,必须重载一元前缀>解引用操作符*和二元中缀指针成员访问操作符->:

class my_ptr {
    value_type& operator*();
    const value_type& operator*() const;
    value_type* operator->();
    const value_type* operator->() const;
  };

注意,这些也几乎总是需要const和非const版本。对于> ->操作符value_type必须是类(或结构或联合)类型,否则它们的>实现将导致编译时错误。

绝不能重载一元地址操作符

操作符->*()参见本题。它很少使用,因此很少重载。事实上,即使是迭代器也不会重载它。