假设我正在实现一个集合,比如说std::vector
。我需要实现iterator
和const_iterator
,但是一旦完成iterator
就可以const_iterator
了,而不仅仅是实现为iterator<const T>
(其中T
集合中包含的类型是什么?
之所以不起作用,一定有原因,因为在实现iterator
和const_iterator
的过程中有上百万个关于如何重用代码的问题,但没有一个说“只使用{{ 1}}作为类型。
答案 0 :(得分:4)
std::iterator_traits<Iter>::value_type
对于T
应该是const_iterator<T>
,但是对于const T
是iterator<const T>
1 。如果将iterator<const T>
用作const_iterator<T>
,则必须违反这些假设之一。
只要值类型的常量性与迭代器的常量性是一个单独的模板参数,就应该可以对两个迭代器使用一个通用模板。像这样:
template<class T>
struct container
{
template<class ItPtr>
struct iterator_common
{
using value_type = T;
using pointer = ItPtr;
using reference = std::remove_pointer_t<ItPtr>&;
// ...
};
using iterator = iterator_common<T*>;
using const_iterator = iterator_common<const T*>;
// ...
};
1 直到C ++ 20,在其中它应该是std::remove_cv_t<const T>
,即T
。因此,在将来的标准版本中,这对您的建议不会有问题。