0

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

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

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

我可以实施某个运营商来支持->吗?

4

4 回答 4

2

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

对于你的情况,你会有类似的东西

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

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

例如,以上使:

my_iterator_instance->foo === ptr_to_entity->foo
于 2013-04-09T05:19:37.793 回答
1

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

大概是这样的。

entity* operator->() {
    ...
}
于 2013-04-09T05:18:46.240 回答
1

看看这个答案:Common operator to overload。您可以跳到“类似指针类型的运算符”以找到您想要的内容。

于 2013-04-09T05:20:54.933 回答
1

运算符重载的摘录

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

  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 和 non-const 版本。对于 >the -> 运算符 value_type 必须是类(或结构或联合)类型,否则它们的 > 实现会导致编译时错误。

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

对于 operator->*() 看到这个问题。它很少使用,因此很少超载。事实上,即使是迭代器也不会重载它。

于 2013-04-09T05:23:45.717 回答