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

问题描述:

所以(我知道这不是完美的,它只是在问问题的目的):迭代重载成员的选择与间接运算符

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

顺便说一下,前缀++运算符应该返回'foo&'而不是'const foo&',否则你将无法执行'++(++ i)' - 并且它缺少'return'语句。 –

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作为返回类型。

+1

除了示例迭代器实际上模拟'const string'的容器... –

+0

@DanielSchepler我不确定这是否是OP的错误。他们使用'std :: string'作为模板参数给'iterator',它使'iterator :: pointer'成为'std :: string *',我相信这个类实际上应该将数据成员存储为'pointer _foo;'。 – NathanOliver