迭代重载成员的选择与间接运算符
所以(我知道这不是完美的,它只是在问问题的目的):迭代重载成员的选择与间接运算符
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
实施会员选择运营商?
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作为返回类型。
除了示例迭代器实际上模拟'const string'的容器... –
@DanielSchepler我不确定这是否是OP的错误。他们使用'std :: string'作为模板参数给'iterator',它使'iterator :: pointer'成为'std :: string *',我相信这个类实际上应该将数据成员存储为'pointer _foo;'。 – NathanOliver
顺便说一下,前缀++运算符应该返回'foo&'而不是'const foo&',否则你将无法执行'++(++ i)' - 并且它缺少'return'语句。 –