| Category: iterators | Component type: function |
template <class T class Distance> inline T* value_type(const input_iterator<T Distance>&); template <class T class Distance> inline T* value_type(const forward_iterator<T Distance>&); template <class T class Distance> inline T* value_type(const bidirectional_iterator<T Distance>&); template <class T class Distance> inline T* value_type(const random_access_iterator<T Distance>&); template <class T> inline T* value_type(const T*);
Although value_type looks like a single function whose return type depends on its argument type in reality it is a set of functions; the name value_type is overloaded. The function value_type must be overloaded for every iterator type [1].
In practice ensuring that value_type is defined requires essentially no work at all. It is already defined for pointers and for the base classes input_iterator forward_iterator bidirectional_iterator and random_access_iterator. If you are implementing a new type of forward iterator for example you can simply derive it from the base class forward_iterator; this means that value_type (along with iterator_category and distance_type) will automatically be defined for your iterator. These base classes are empty: they contain no member functions or member variables but only type information. Using them should therefore incur no overhead.
Note that while the function value_type was present in the original STL it is no longer present in the most recent draft C++ standard: it has been replaced by the iterator_traits class At present both mechanisms are supported [2] but eventually value_type will be removed.
template <class ForwardIterator1
class ForwardIterator2
class ValueType>
inline void __iter_swap(ForwardIterator1 a
ForwardIterator2 b
ValueType*) {
T tmp = *a;
*a = *b;
*b = tmp;
}
template <class ForwardIterator1
class ForwardIterator2>
inline void iter_swap(ForwardIterator1 a
ForwardIterator2 b) {
__iter_swap(a
b
value_type(a));
}
[1] Note that distance_type is not defined for Output Iterators or for Trivial Iterators. In the case of Output Iterators this is because an Output Iterator does not have a value type: it is not possible to dereference an Output Iterator and obtain a value. In the case of Trivial Iterators this is because the concept was introduced only for conceptual clarity in order to separate the axioms related to an object that refers to another object from those related to iteration over a range. In fact the STL does not define any types that are Trivial Iterators. Although built-in C pointers may be Trivial Iterators the C type system does not allow a distinction between pointers that are Trivial Iterators and pointers that are Random Access Iterators into C arrays. Consequently there is no Trivial Iterator category tag or iterator base.
[2] The iterator_traits class relies on a C++ feature known as partial specialization. Many of today's compilers don't implement the complete standard; in particular many compilers do not support partial specialization. If your compiler does not support partial specialization then you will not be able to use iterator_traits and you will have to continue using the functions iterator_category distance_type and value_type. This is one reason that those functions have not yet been removed.