C++ Can';迭代器';仅键入子类';常量迭代器';?

C++ Can';迭代器';仅键入子类';常量迭代器';?,c++,casting,iterator,containers,C++,Casting,Iterator,Containers,在我对定制集装箱有一些疑问之后。在我的容器中,iterator是const\u iterator的一个子类,因此我可以“免费”将非常量转换为常量。但是这是允许的,或者这种设置有任何缺点或不起作用的情况吗?考虑一个需要修改迭代器成员的情况。是的,这很好。例如,这就是VC10对vector迭代器的实现结构。请参见中的\u Vector\u iterator和\u Vector\u const\u iterator 顺便说一下,编写迭代器很难。学习和使用boost::iterator库是值得的。子类化

在我对定制集装箱有一些疑问之后。在我的容器中,
iterator
const\u iterator
的一个子类,因此我可以“免费”将非常量转换为常量。但是这是允许的,或者这种设置有任何缺点或不起作用的情况吗?

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

是的,这很好。例如,这就是VC10对
vector
迭代器的实现结构。请参见
中的
\u Vector\u iterator
\u Vector\u const\u iterator


顺便说一下,编写迭代器很难。学习和使用boost::iterator库是值得的。

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

即使您不想依赖Boost部件,也要检查Boost.Iterator库,尤其是
Iterator\u facade
Iterator\u适配器

这里有一个完整的示例,说明如何为类编写
迭代器
常量迭代器
。他们的想法是编写一个模板
迭代器_base
类,然后您可以将其用于以下行中的常量和非常量类型:

template <class Value> class iterator_base;

typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;
模板类迭代器\u基;
typedef迭代器\基本迭代器;
typedef迭代器\u基常量\u迭代器;
子类化的问题是,您应该提供一个虚拟析构函数,然后您将面临切片(当从
迭代器构建
常量迭代器时)


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

还有?我想你需要详细说明一下。我知道,但在我的例子中,它是一个小库,我不希望它依赖于任何东西,包括Boost部件。STL的一些实现像这样工作已经很好了。您知道标准中有一个条款描述了迭代器和一般要求吗?FCD(n3035.pdf)的24.2描述了迭代器及其要求。如果有更多的意见出现,让我们拭目以待。“然后你应该提供一个虚拟析构函数”-但我的析构函数不会做任何事情。即使是这样,
迭代器
类型也可能只是继承
常量迭代器
析构函数,而不做任何额外的事情。“你暴露在切片中”-你能详细说明一下吗,我不明白你在这里的意思。切片的一个例子,
iterator it;常量迭代器cit=静态强制转换(it)。在这里,当您将类型转换的
it
分配给
cit
时,您添加到
it
的任何额外变量都不会复制到
cit
。但我认为这是可以的,因为我们再也不能降级到
迭代器了。