迭代器重载成员选择与间接运算符
iterator Overload Member Selection vs Indirection Operator
因此,为了创建一个Minimal。完整、可验证的示例我在这里创建了一个玩具iterator
(我知道它并不完美,只是为了提问):
class foo : public iterator<input_iterator_tag, string> {
string _foo;
static const size_t _size = 13;
public:
const string& operator*() { return _foo; }
const foo& operator++() {
_foo += '*';
return *this;
}
const foo operator++(int) {
auto result = *this;
_foo += '*';
return result;
}
bool operator==(const foo& rhs) { return _foo.empty() != rhs._foo.empty() && _foo.size() % _size == rhs._foo.size() % _size; }
bool operator!=(const foo& rhs) { return !operator==(rhs); }
};
我读到InputIterator需要定义成员选择运算符。Indirection运算符是有意义的,但成员选择运算符在这里让我感到困惑。如何为foo
实现成员选择运算符?
const string* operator->() const { return &_foo; }
示例用法:
foo i;
++i;
assert(i->length() == 1);
其工作方式是,编译器将生成对operator->
的重复调用,直到返回类型为原始指针(因此在本例中仅对foo::operator->
进行一次调用),然后对该指针执行常规成员选择操作。
operator->()
应该返回一个指针类型,该类型是迭代器使用的容器所持有的类型。因此,如果您有一个持有std::string
的容器,那么iterator::operator->
应该返回std::sting*
。在您的情况下,由于从std::iterator
派生,因此可以使用pointer
typedef作为返回类型。
相关文章:
- 有条件地选择带有 decltype() 和三元运算符的类型
- 为什么选择转换运算符的重载?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 了解转换运算符的选择C++
- 为什么<iostream>运算符<<会选择明显错误的重载?
- 带大小参数和不带大小参数的"运算符删除":当两者都可用时,选择哪一个?
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 为什么在指针上对成员访问/元素选择有不同的运算符
- 强制编译器选择常量运算符重载
- 重载成员选择运算符
- 迭代器重载成员选择与间接运算符
- 关于智能指针中取消引用和成员选择运算符的定义
- clang-libc++错误:重载解析选择了隐式删除的复制赋值运算符
- C++ 编译器选择输出流运算符<<的错误重载
- 运算符 = 重载C++有选择地工作
- 转换是模棱两可的.标准隐式转换无法选择强制转换运算符
- 构造函数重载选择了强制转换运算符而不是结构类型
- iOS中箭头成员选择运算符的使用
- 具有重载的取消引用运算符的成员选择
- 显式运算符<<选择重载'wrong'