C ++ 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
функция для смежных итераторов.
Конечно, концепция смежности работает, если &(it[n]) == (&(*it)) + n
, для всех n
, но это нельзя проверить во время компиляции.
РЕДАКТИРОВАТЬ: я нашел это видео, в котором это рассматривается в более широком контексте концепций C ++. CppCon 2016: Создание и Расширение иерархии итераторов в современном многоядерном мире Патрика Недзельски. В решении используются концепции (Lite), но в конечном итоге идея состоит в том, что смежные итераторы должны реализовывать функцию pointer_from
(такую же, как моя функция data(...)
).
Вывод состоит в том, что концепции помогут формализовать теорию, но они не являются волшебством в том смысле, что кто-то где-то определит новые специально названные функции над смежными итераторами. Обсуждение обобщается на сегментированные итераторы (с соответствующими функциями segment
и local
), к сожалению, в нем ничего не говорится о полосовых указателях.
ИЗМЕНИТЬ 2020:
В стандарте теперь есть
struct contiguous_iterator_tag: public random_access_iterator_tag { };
contiguous_iterator_tag
? ← потому что он незаметно нарушит код до C ++ 17, предполагавший, чтоstd::vector::iterator
является итератором с произвольным доступом? - person kennytm   schedule 17.03.2017random_access_iterator
получен изcontiguous_iterator_tag
). Было бы прискорбно, если бы разрыв произошел только из-за неправильного использования трейта. - person alfC   schedule 17.03.2017.data()
илиdata(ContiguousIterator it)
функцию для всех смежных итераторов, это аналогично контейнерам, которые в настоящее время имеют член.data()
, когда они смежные. - person alfC   schedule 22.03.2017