迭代器重载成员选择与间接运算符

iterator Overload Member Selection vs Indirection Operator

本文关键字:运算符 选择 重载 成员 迭代器      更新时间:2023-10-16

因此,为了创建一个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作为返回类型。