簡體   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