繁体   English   中英

如何在“生成”迭代器上重载operator->?

[英]How to overload operator-> on a “generating” iterator?

我正在定义一个迭代器类型,它不会显式存储其当前值。 相反,它是另一个迭代器的包装器,并返回底层迭代器的值和另一个值的std::pair 类定义的相关部分:

class MyIterator : public std::iterator<input_iterator, std::pair<Foo *, Bar *> > {

    FooPtrIterator d_iter;
    Bar d_bar;

    public:

        MyIterator(FooPtrIterator iter, Bar const &bar)
        :
            d_iter(iter),
            d_bar(bar)
        { }

        // Returning by value, not storing the pair itself.
        value_type operator*() const {
            return std::make_pair(*d_iter, &d_bar);
        }

        // Can't return by value!
        ??? operator->() const {
            return ???;
        }

};

现在这让我在重载operator->时遇到麻烦,因为我希望返回一个指针,或其他本身支持operator->东西。

我可以简单地将当前的std::pair存储为类成员:

    value_type d_current;

但是,这让我在构造函数中遇到了麻烦,因为我当时不知道FooPtrIterator iter是否是一个有效的迭代器,所以我d_current引用它来为d_current提供一个值。

我也可以使operator->返回一个boost::shared_ptr<value_type>但这是一个可怕的黑客攻击,其开销比应有的要多。

我觉得这个“生成”迭代器不应该存在。 是这样,还是有另一种方法呢?

我建议创建一个自己的类,包含Foo *和Bar *对,如下所示:

class MyPair  {
private:
  FooPtrIterator foo;
  Bar bar;

public:
  MyPair(const FooPtrIterator& it, const Bar& b) : foo(it), bar(b)  {}

  Foo* first() { return *foo; }
  Bar* second() { return &bar; }
};

然后在迭代器类中使用它而不是两个值。 您将不得不在代码中更改 - > first和 - > second to - > first()和 - > second(),但这应该是可接受的更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM