因此,为了创建Minimal. Complete, Verifiable Example,我在这里创建了一个玩具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需要定义成员选择运算符。间接运算符是有道理的,但会员选择运算符在这里让我感到困惑。如何为foo
实施成员选择运算符?
答案 0 :(得分:1)
operator->()
应返回容器所使用的类型的指针类型,使用迭代器。因此,如果您的容器中包含std::string
,则iterator::operator->
应返回std::sting*
。在您从std::iterator
派生的情况下,您可以使用pointer
typedef作为返回类型。
答案 1 :(得分:1)
const string* operator->() const { return &_foo; }
使用示例:
foo i;
++i;
assert(i->length() == 1);
这种方式的工作方式是编译器会生成对operator->
的重复调用,直到返回类型为原始指针(因此在这种情况下只需调用foo::operator->
),然后执行常规成员对该指针的选择操作。