代码之家  ›  专栏  ›  技术社区  ›  Thomas

如何在“生成”迭代器上重载操作符->呢?

  •  3
  • Thomas  · 技术社区  · 15 年前

    std::pair 基础迭代器值的s和另一个值。类定义的相关部分:

    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-> ,因为我需要返回一个指针,或者其他本身支持的东西 .

    标准::对 作为班级成员:

        value_type d_current;
    

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

    操作员-> boost::shared_ptr<value_type> 但这是一个可怕的黑客与更多的开销比应该需要的。

    我觉得这个“生成”迭代器不应该存在。是这样,还是有别的办法?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Karel Petranek    15 年前

    我建议创建一个包含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; }
    };