【问题标题】:How to overload operator-> on a "generating" iterator?如何在“生成”迭代器上重载 operator->?
【发布时间】:2010-07-27 10:46:58
【问题描述】:

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

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-&gt; 时,这给我带来了麻烦,因为我希望返回一个指针,或者其他本身支持operator-&gt; 的东西。

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

    value_type d_current;

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

我也可以让 operator-&gt; 返回一个 boost::shared_ptr&lt;value_type&gt;,但这是一个可怕的 hack,开销超出了应有的水平。

我觉得这个“生成”迭代器不应该存在。是这样吗,还是有其他解决方法?

【问题讨论】:

    标签: c++ iterator operator-overloading


    【解决方案1】:

    我建议创建一个包含 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 更改为 ->first() 和 ->second(),但这应该是可以接受的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2018-05-24
      • 2017-09-02
      • 2018-05-16
      • 2012-02-18
      • 2023-03-23
      相关资源
      最近更新 更多