如何让我自己编写的迭代器支持 ->?
How do I let my self-written iterator support ->?
我正在用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必须是类(或结构或联合)类型,否则它们的>实现将导致编译时错误。
绝不能重载一元地址操作符
操作符->*()参见本题。它很少使用,因此很少重载。事实上,即使是迭代器也不会重载它。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- EASTL矢量<向量<int>>连续的
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 将 IPv6 支持添加到雨量计
- 为什么C++不支持对未初始化变量进行智能分析?
- LMDB 是否支持随机读取?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?