【发布时间】:2011-02-20 03:06:24
【问题描述】:
在another question about iterators 之后,我对自定义容器有些怀疑。在我的容器中,iterator 是const_iterator 的子类,因此我可以“免费”从非常量转换为常量。但这是否允许,或者这样的设置是否有任何缺点或不工作的情况?
【问题讨论】:
标签: c++ casting iterator containers
在another question about iterators 之后,我对自定义容器有些怀疑。在我的容器中,iterator 是const_iterator 的子类,因此我可以“免费”从非常量转换为常量。但这是否允许,或者这样的设置是否有任何缺点或不工作的情况?
【问题讨论】:
标签: c++ casting iterator containers
考虑一个需要修改迭代器成员的案例。
【讨论】:
是的,这很好。例如,这就是 VC10 的 vector 迭代器实现的结构。请参阅<vector> 中的_Vector_iterator 和_Vector_const_iterator。
顺便说一句,编写迭代器很困难。值得您花时间学习和使用 boost::iterator 库。
【讨论】:
在这里子类化对我来说似乎很奇怪,但实际上存在一个问题。
即使您不想依赖 Boost 部件,也请检查 Boost.Iterator 库,尤其是 iterator_facade 和 iterator_adaptor 位。
有一个完整的示例说明如何为您的班级编写 iterator 和 const_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<const_iterator>( it );。在这里,当您将类型转换的it 分配给cit 时,您添加到it 的任何额外变量都不会复制到cit。但我认为这没关系,因为我们再也不能沮丧到iterator。