Мне интересно использовать синтаксис итератора для других типов итераций; в частности, не над контейнером, а просто для очистки кода, который функционирует как итерация.
У меня уже есть кое-что работающее (и, возможно, - если оно не сломано, не исправить?), но я хотел бы знать формальные требования к итератору для всех случаев (т. е. различные типы итераторов, такие как константа, и их категории / теги, например, вперед).
Вот что как я понимаю реализацию из cppreference
{
auto && __range = /* range_expression */;
auto __begin = __range.begin( );
auto __end = __range.end( );
for ( ;
__begin != __end;
++__begin )
{
/* range_declaration */ = *__begin;
/* loop_statement */
}
}
Из того, что я собрал, текущие требования:
__range
должен содержать не -stati c Доступный по rvalue элемент функции с именами begin
и end
, которые не принимают параметров - Возврат из
begin
должен поддерживать оператор предварительного увеличения - Возврат из
begin
должен поддерживать оператор разыменования - Возвращает
begin
и end
должен поддерживать оператор не равно
Но потом я смотрю на стандарт и вижу вещи как const_iterator
и все псевдонимы-члены типа итератора, возвращенные из begin
и end
, но я никогда не видел, чтобы они использовались (за исключением чего-то вроде функций алгоритми c, в этом случае формальных требований не существует, кроме конца -кодер, и не являются фактическими требованиями для кого-то, делающего свой собственный итератор).