2015-10-14 5 views
3

Я пытаюсь понять, когда фактически используется iterator::value_type.Когда используется значение «value_type» используемого итератора?

Потому что все операторы итераторов, похоже, используют только iterator::pointer и iterator::reference.

Вопрос: Действительно ли iterator::value_type действительно используется для чего-то?

Дополнительный вопрос: ли итератор в наследство от

std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&> 

рейза некоторые смысловые вопросы?

EDIT: Чтобы понять, почему я задаю этот вопрос, потому что я работаю на итератор для типа, для которого pointer и reference являются прокси-классы.

+0

Что касается EDIT, то в этом случае полезно иметь 'value_type' как отдельный' typedef', так как 'remove_reference_t ' больше не относится к типу базового значения, но имеет тип прокси. – vsoftco

ответ

6

Я могу придумать его использование в общем коде. Предположим, вы пишете общую функцию, которая суммирует диапазон в C++ 11. Вы можете написать его как

template<typename It> 
auto sum(It begin, It end) -> typename It::value_type 
{ 
    typename It::value_type _sum{}; 
    // compute the sum 
    return _sum; 
} 

Конечно, вы можете использовать decltype(*begin) вместо этого, но с использованием value_type выглядит аккуратно-эр и изящнее. В C++ 14 Я не могу придумать, действительно ли это полезно, так как вы можете получить автоматический вывод типа на возврат функции.

EDIT Как отметил @Luc Дантона в комментарии, используя decltype(*begin) дает ссылку большую часть времени, так что вам нужно std::remove_reference, что делает его выглядеть довольно противно. Таким образом, value_type подходит.

+1

Если 'It' является, например, 'std :: vector :: iterator', затем' decltype (* begin) 'is' int & ', который больше соответствует' reference', чем 'value_type'. –

+0

@LucDanton Хорошая точка! – vsoftco

+2

@LucDanton И даже не гарантированно вернуть тип значения, поскольку в принципе итератор может быть реализован через прокси, а не обязательно указатели. – vsoftco

Смежные вопросы