Как определить каноническим способом итераторы прямого вывода в C ++ 11?
Согласно стандарту forward_iterator является только input_iterator. Таким образом, соответствующий forward_iterator_tag
только расширяется input_iterator_tag
, Если мы используем std::iterator
Чтобы определить наши итераторы, какой тег мы используем для прямого итератора вывода?
Можно ли определить частный тег, который расширяет оба forward_iterator_tag
а также output_iterator_tag
или есть лучшее решение?
Каноническая вещь, которую нужно сделать, это наследовать от std::iterator<std::forward_iterator_tag, T>
только. Итераторы имеют только одну категорию.
Стандарт не имеет алгоритмов (или других применений) для выходного итератора, который также является прямым итератором. Все использование выходных итераторов в стандарте требует только однопроходного.
Вместо этого стандарт имеет идею изменяемых и неизменяемых итераторов категорий forward / bidi / randomaccess. Все алгоритмы, которые должны писать через итераторы, и которые требуют лучше, чем однопроходный, также читают через те же итераторы, через которые они пишут. Это std::remove
, std::sort
и другие алгоритмы мутации.
Разница между изменяемыми и неизменяемыми итераторами не определяется тегом итератора, это определяется тем, правильно ли сформированы выражения присваивания. Так, например, если вы передаете итератор std::sort
это неизменяемый, тогда алгоритм все равно не будет компилироваться, поэтому обычно нет необходимости, чтобы входной итератор также был помечен output_iterator_tag
, Все алгоритмы, которые требуют OutputIterator
Просто буду работать с изменяемым ForwardIterator
опять же нет необходимости помечать его output_iterator_tag
,
Если ваши потребности отличаются от требований стандартных алгоритмов, тогда я не могу сразу подумать о причине, по которой ваше предложение не будет работать для ваших итераторов. Но он не обнаружит изменяемые стандартные итераторы. Например std::deque<int>::iterator
а также int*
иметь категорию итератора random_access_iterator_tag
, а не ваш личный тег и не имеет ничего общего с output_iterator_tag
, Так что вам, вероятно, будет лучше определить свой собственный класс черт, чем надеяться адаптировать существующие iterator_traits::iterator_category
предоставить информацию, которую вы хотите.
Других решений пока нет …