С++ 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), к сожалению, он ничего не говорит о перечеркнутых указателях.