Open
Description
Several iterator types for view adaptors have wording like this (from [range.filter.iterator]):
iterator
::iterator_category
is defined as follows:
- Let
C
denote the typeiterator_traits<iterator_t<V>>::iterator_category
. - If
C
modelsderived_from<bidirectional_iterator_tag>
, theniterator_category
denotesbidirectional_iterator_tag
. - Otherwise, if
C
modelsderived_from<forward_iterator_tag>
, theniterator_category
denotesforward_iterator_tag
. - Otherwise,
iterator_category
denotesC
.
We could avoid the repetition with an exposition-only helper along the lines of:
template<class C, class... Cats>
struct floor-cat
{ using type = C; };
template<class C, class Cat, class... Cats>
struct floor-cat
: conditional<derived_from<C, Cat>, Cat, floor-cat<C, Cats...>>
{ };
template<class T, class... Cats>
using floor-cat-t = typename floor-cat<T, Cats...>::type;
And then define iterator
::iterator_category
for the example above as floor-cat
<iterator_traits<iterator_t<V>>::iterator_category, bidirectional_iterator_tag, forward_iterator_tag>
.
Metadata
Metadata
Assignees
Labels
Issue must be reviewed by LWG.Issue must be reviewed by LWG.