迭代器重载成员选择与间接操作符

时间:2016-05-12 15:24:16

标签: c++ iterator operators member indirection

因此,为了创建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实施成员选择运算符?

2 个答案:

答案 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->),然后执行常规成员对该指针的选择操作。