С++ 17 представил концепцию ContiguousIterator http://en.cppreference.com/w/cpp/iterator.
Однако не кажется, что есть планы contiguous_iterator_tag
(так же, как мы теперь имеем random_access_iterator_tag
), сообщенные std::iterator_traits<It>::iterator_category
.
Почему contiguous_iterator_tag
отсутствует?
Существует ли обычный протокол, чтобы определить, является ли итератор непрерывным? Или тест времени компиляции?
В прошлом я упомянул, что для контейнеров, если есть член .data()
, который преобразуется в указатель на ::value
, и существует элемент .size()
, который может конвертироваться в различия указателя, следует предположить, что контейнер смежный, но я не могу вытащить аналогичную функцию итераторов.
Одним из решений может быть также функция data
для непрерывных итераторов.
Конечно, концепция Contiguous работает, если &(it[n]) == (&(*it)) + n
для всех n
, но это невозможно проверить во время компиляции.
EDIT. Я нашел это видео, которое ставит его в более широкий контекст концепций С++. CppCon 2016: "Создание и расширение иерархии итераторов в современном многоярусном мире" Патриком Немцельским. Решение использует концепции (Lite), но в конце идея состоит в том, что непрерывные итераторы должны реализовывать функцию pointer_from
(такую же, как моя функция data(...)
).
Вывод состоит в том, что концепции помогут формализовать теорию, но они не являются волшебными, в том смысле, что кто-то где-то определит новые специально названные функции над итераторами, которые смежны.
Разговор обобщается на сегментированные итераторы (с соответствующими функциями segment
и local
), к сожалению, он ничего не говорит о перечеркнутых указателях.