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

时间:2013-04-09 05:16:27

标签: c++ iterator

我在C ++中编写自己的迭代器:

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

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

我是否可以实施某个运营商来支持->

4 个答案:

答案 0 :(得分:2)

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

对于你的情况,你会有像

这样的东西
entity* operator->() {
    return ptr_to_entity;
}

这有点奇怪,因为->你的重载会返回一个指向对象的指针,然后就会使用->

如上所述:

my_iterator_instance->foo === ptr_to_entity->foo

答案 1 :(得分:1)

是的,它被称为operator->。但请记住operator->很特别,它应该返回一个指针和常规运算符 - >将应用于该指针。所以鉴于上面的代码我无法确切地告诉你如何实现它。如果您填写运营商的详细信息*我可以提供更多帮助。

可能就是这些问题。

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

答案 2 :(得分:1)

看看这个答案:Common operators to overload。您可以跳到“类似指针类型的运算符”来查找所需内容。

答案 3 :(得分:1)

Operator overloading

的摘录

我强烈建议你阅读上面写得好的

  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版本。对于> - > operator value_type必须是class(或struct或union)类型,否则它们的>实现会导致编译时错误。

     

一元地址运算符永远不应该重载。

     

对于operator-> *(),请参阅此问题。它很少使用,因此很少超载。在>事实上,即使是迭代器也不会使它超载。