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

“迭代器”类型能否只是“const_迭代器”的子类?

  •  15
  • doublep  · 技术社区  · 14 年前

    another question about iterators 我对定制集装箱有些怀疑。在我的容器里, iterator 是的子类 const_iterator 这样我就可以“免费”从非常量转换为常量。但这是允许的,还是这种设置有任何缺点或不工作的场景?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Terry Mahaffey    14 年前

    是的,这很好。这就是VC10实现迭代器的方法 vector 例如,是结构化的。见 _Vector_iterator _Vector_const_iterator 在里面 <vector> .

    顺便说一下,编写迭代器很困难。值得花时间学习和使用boost::迭代器库。

        2
  •  2
  •   Matthieu M.    14 年前

    在这里,子类化看起来很奇怪,但实际上存在一个问题。

    即使您不想依赖boost部分,也可以检查boost.iterator库,尤其是 iterator_facade iterator_adaptor 位。

    有一个关于如何编写 iterator 和A const_iterator 为了你的课,不要重复太多。他们的想法是写一个模板 iterator_base 类,然后可用于以下行中的常量和非常量类型:

    template <class Value> class iterator_base;
    
    typedef iterator_base<T> iterator;
    typedef iterator_base<const T> const_iterator;
    

    子类化的问题是,然后您应该提供一个虚拟的析构函数,并且暴露在切片中(当构建一个 常数迭代器 从一个 迭代器 )

    所以,和这里的其他人不同,我不认为这是“好的”。

        3
  •  -1
  •   rkellerm    14 年前

    考虑一个需要修改迭代器成员的情况。