Как обнаружить смежные итераторы, если нет std::contigious_iterator_tag? ⇐ C++
Как обнаружить смежные итераторы, если нет std::contigious_iterator_tag?
В C++17 появилась концепция ContigiousIterator http://en.cppreference.com/w/cpp/iterator. Однако, похоже, не планируется иметь contigious_iterator_tag (точно так же, как сейчас у нас есть random_access_iterator_tag), сообщаемый std::iterator_traits ::iterator_category.
Почему отсутствует contigious_iterator_tag?
Существует ли общепринятый протокол для определения того, является ли итератор непрерывным? Или тест времени компиляции?
Ранее я упоминал, что для контейнеров, если есть элемент .data(), который преобразуется в указатель на ::value type и есть член .size(), конвертируемый в различия указателей, то следует предположить, что контейнер является смежным, но я не могу использовать аналогичную функцию итераторов.
Одним из решений может быть создание функции data для смежных итераторов.
Конечно, концепция непрерывности работает, если &(it[n]) == (&(*it)) + n, для всех n, но это может не проверяется во время компиляции.
РЕДАКТИРОВАТЬ: я нашел это видео, в котором это рассматривается в более широком контексте концепций C++. CppCon 2016: «Построение и расширение иерархии итераторов в современном многоядерном мире», Патрик Нидзельски. В решении используются концепции (Lite), но в конце концов идея состоит в том, что смежные итераторы должны реализовывать функцию pointer_from (такую же, как моя функция data(...)).< /п> Вывод таков: концепции помогут формализовать теорию, но они не являются волшебством в том смысле, что кто-то где-то будет определять новые функции с особыми именами над итераторами, которые являются смежными. Речь распространяется на сегментированные итераторы (с соответствующими функциями segment и local), но, к сожалению, ничего не говорится о пошаговых указателях.
РЕДАКТИРОВАТЬ 2020:
Теперь в стандарте есть
struct contigious_iterator_tag: public random_access_iterator_tag { }; https://en.cppreference.com/w/cpp/itera ... rator_tags
В C++17 появилась концепция ContigiousIterator http://en.cppreference.com/w/cpp/iterator. Однако, похоже, не планируется иметь contigious_iterator_tag (точно так же, как сейчас у нас есть random_access_iterator_tag), сообщаемый std::iterator_traits ::iterator_category.
Почему отсутствует contigious_iterator_tag?
Существует ли общепринятый протокол для определения того, является ли итератор непрерывным? Или тест времени компиляции?
Ранее я упоминал, что для контейнеров, если есть элемент .data(), который преобразуется в указатель на ::value type и есть член .size(), конвертируемый в различия указателей, то следует предположить, что контейнер является смежным, но я не могу использовать аналогичную функцию итераторов.
Одним из решений может быть создание функции data для смежных итераторов.
Конечно, концепция непрерывности работает, если &(it[n]) == (&(*it)) + n, для всех n, но это может не проверяется во время компиляции.
РЕДАКТИРОВАТЬ: я нашел это видео, в котором это рассматривается в более широком контексте концепций C++. CppCon 2016: «Построение и расширение иерархии итераторов в современном многоядерном мире», Патрик Нидзельски. В решении используются концепции (Lite), но в конце концов идея состоит в том, что смежные итераторы должны реализовывать функцию pointer_from (такую же, как моя функция data(...)).< /п> Вывод таков: концепции помогут формализовать теорию, но они не являются волшебством в том смысле, что кто-то где-то будет определять новые функции с особыми именами над итераторами, которые являются смежными. Речь распространяется на сегментированные итераторы (с соответствующими функциями segment и local), но, к сожалению, ничего не говорится о пошаговых указателях.
РЕДАКТИРОВАТЬ 2020:
Теперь в стандарте есть
struct contigious_iterator_tag: public random_access_iterator_tag { }; https://en.cppreference.com/w/cpp/itera ... rator_tags
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение