чтоб мне отдался итератор, который хавает какую нибудь функцию или параметр, в которой закодировано его поведение? Допустим, я хочу, чтоб итератор при инкрементации контейнера с числами смотрел, если там лежит число 666, то он автоматом бы перескакивал на следующий элемент, то есть мне как клиенту данных итератора, отдавались бы уже как бы фильтрованные итератором данные.
https://en.cppreference.com/w/cpp/ranges
накрайняк https://github.com/ericniebler/range-v3
Помимо рекомендаций выше. Итератор - это класс, написанный на С++. Можно самому написать другой класс, который будет итератором. Класс является итератором тогда, когда наследуется от iterator_traits, там пять элементов в traits. В таком классе можно реализовать любое поведение, конечно.
А ну ты прав, в принципе! Можно самому проверять, что отдавать в своем итераторе.
вот от iterator_traits наследоваться не надо, надо выбрать какая из категорий/концептов итераторов интересует и выполнить её требования в своём классе см. - https://en.cppreference.com/w/cpp/iterator - https://en.cppreference.com/w/cpp/header/iterator также может быть полезным: https://www.boost.org/doc/libs/1_83_0/doc/html/boost_stlinterfaces/tutorial___iterator_interface_.html
Все-таки traits должны быть в любом типе-итераторе. template <typename I> concept Iterator = requires() { typename I::value_type; typename I::difference_type; typename I::reference; typename I::pointer; typename I::iterator_category; }; А так да, поведение зависит от категории, ну и от фантазии разработчика.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Погоди. А мне значит надо делать фасад для контейнера сначала. Иначе как я подружу свой итератор со стандартным контейнером? Мне получается надо как бы свой класс-контейнер делать со своим итератором, который будет фильтровать то, что ему будет приносить родной итератор стандартного вектора... Или же просто делать прокси итератор, просто принимать итератор и смотреть сначала что в нем, если не то, то делать ++
однако шаблон iterator_traits<Iter>, от которого вы посоветовали наследоваться предназначен не для того чтобы от него наследоваться, а для того, чтобы передать туда тип итератора и получить из него эти тайп алиасы вы как минимум попутали с наследованием от https://en.cppreference.com/w/cpp/iterator/iterator
Если тебе надо иметь свой итератор от контейнера STL (что очень сомнительное архитектурное решение), то я вижу два пути: - сделать свой класс, который наследуется от контейнера STL и переопределить методы на возврат своего итератора - сделать прокси-итератор, как ты пишешь, принимать в него результат итератора контейнера Но это все выглядит как надевать штаны через голову. Чего-то слишком сложно, надо поискать решение попроще.
от контейнеров STL нельзя наследоваться публично т.к. они не содержат вирт деструктора
Пассивная агрессия - это повод задуматься о личном состоянии. Что-то где-то болит, видимо.
А кто-то собрался удалять создаваемый объект по указателю на родителя? Где об этом шла речь?
полиморфизм работает через ссылку либо указатель
Речь о полиморфизме не идет.
Просто напишите итератор который создаётся от итератора. Реализуйте в нем свою логику и все. Но по данному условию вам нельзя делать категорию выше input. Такие итераторы уже есть в boost можно взять там.
Обсуждают сегодня