std::iterator_traits<Iter>::value_type
должно быть T
для const_iterator<T>
, но const T
1 для iterator<const T>
.Если вы используете 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
.Таким образом, это не будет проблемой для вашего предложения в будущей стандартной версии.