【问题标题】:Can 'iterator' type just subclass 'const_iterator'?'iterator' 可以只键入'const_iterator' 的子类吗?
【发布时间】:2011-02-20 03:06:24
【问题描述】:

another question about iterators 之后,我对自定义容器有些怀疑。在我的容器中,iteratorconst_iterator 的子类,因此我可以“免费”从非常量转换为常量。但这是否允许,或者这样的设置是否有任何缺点或不工作的情况?

【问题讨论】:

    标签: c++ casting iterator containers


    【解决方案1】:

    考虑一个需要修改迭代器成员的案例。

    【讨论】:

    • 然后呢?我想你需要详细说明。
    【解决方案2】:

    是的,这很好。例如,这就是 VC10 的 vector 迭代器实现的结构。请参阅<vector> 中的_Vector_iterator_Vector_const_iterator

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

    【讨论】:

    • 我知道,但就我而言,它是一个小型库,我不希望它依赖任何东西,包括 Boost 部件。
    • STL 的某些实现可以这样工作已经很好了。您是否碰巧知道标准中描述迭代器和一般要求的条款?
    • FCD (n3035.pdf) 的 24.2 描述了迭代器及其要求
    • 谢谢。让我们等待是否有更多意见出现。
    【解决方案3】:

    在这里子类化对我来说似乎很奇怪,但实际上存在一个问题。

    即使您不想依赖 Boost 部件,也请检查 Boost.Iterator 库,尤其是 iterator_facadeiterator_adaptor 位。

    有一个完整的示例说明如何为您的班级编写 iteratorconst_iterator 而不会重复太多。他们的想法是编写一个模板iterator_base 类,然后您可以将其用于以下行中的 const 和非 const 类型:

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

    子类化的问题是你应该提供一个虚拟析构函数并且你会暴露于切片(从iterator 构建const_iterator 时)

    所以,与这里的其他人不同,我不觉得它“很好”。

    【讨论】:

    • “然后你应该提供一个虚拟析构函数”——但我的析构函数无论如何都不做任何事情。即使他们这样做了,iterator 类型也可能只是继承 const_iterator 析构函数,而无需做任何额外的事情。 “你暴露在切片中”——你能详细说明一下吗,我不明白你的意思。
    • 切片示例,iterator it; const_iterator cit = static_cast&lt;const_iterator&gt;( it );。在这里,当您将类型转换的it 分配给cit 时,您添加到it 的任何额外变量都不会复制到cit。但我认为这没关系,因为我们再也不能沮丧到iterator
    猜你喜欢
    • 2017-12-06
    • 2011-11-13
    • 1970-01-01
    • 2020-04-03
    • 2012-05-10
    • 1970-01-01
    • 2015-01-16
    • 2021-09-06
    相关资源
    最近更新 更多