我正在用 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-> 是特殊的,它应该返回一个指针,并且常规的 operator-> 将应用于该指针。因此,鉴于上面的代码,我无法确切地告诉您如何实现它。如果您填写运营商的详细信息*,我可能会提供更多帮助。
大概是这样的。
entity* operator->() {
...
}
看看这个答案:Common operator to overload。您可以跳到“类似指针类型的运算符”以找到您想要的内容。
运算符重载的摘录
我强烈建议您阅读以上内容,因为它写得很好
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->*() 看到这个问题。它很少使用,因此很少超载。事实上,即使是迭代器也不会重载它。