【问题标题】:iterator Overload Member Selection vs Indirection Operator迭代器重载成员选择与间接运算符
【发布时间】:2016-09-08 13:06:27
【问题描述】:

所以为了创建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 的成员选择运算符将如何实现?

【问题讨论】:

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

标签: c++ iterator operators member indirection


【解决方案1】:
const string* operator->() const { return &_foo; }

示例用法:

foo i;
++i;
assert(i->length() == 1);

其工作方式是编译器将生成对operator-&gt; 的重复调用,直到返回类型为原始指针(因此在这种情况下只需一次调用foo::operator-&gt;),然后对其执行常规成员选择操作指针。

【讨论】:

    【解决方案2】:

    operator-&gt;() 应该返回一个指针类型,该指针类型是容器持有的迭代器所使用的类型。因此,如果您有一个包含std::string 的容器,那么iterator::operator-&gt; 应该返回一个std::sting*。在您的情况下,由于您从 std::iterator 派生,您可以使用 pointer typedef 作为返回类型。

    【讨论】:

    • @DanielSchepler 我不确定这是否是 OP 的错误。他们使用std::string 作为iterator 的模板参数,这使得iterator::pointer 成为std::string*,我相信该类实际上应该将数据成员存储为pointer _foo;
    猜你喜欢
    • 2011-10-18
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-12-07
    相关资源
    最近更新 更多