类别:迭代器 | 组件类型:函数 |
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*);
尽管value_type看起来像是一个单个函数,其返回类型依赖于它的参数类型,但实际上它是函数集;名称value_type已重载。函数value_type必须针对每个迭代器类型重载 [1]。
在实践中,确保value_type的定义实际上根本不需要工作。它已经针对指针定义,并且针对基类input_iterator, forward_iterator, bidirectional_iterator和random_access_iterator已定义。如果您正在实现一个新类型的正向迭代器,例如,您可以简单地从基类forward_iterator派生它;这意味着value_type(以及iterator_category和distance_type) 将自动为您的迭代器定义。这些基类是空类:它们不包含成员函数或成员变量,只包含类型信息。因此,使用它们不会产生开销。
请注意,虽然函数value_type存在于原始 STL 中,但它不再存在于最新的 C++ 标准草案中:它已被iterator_traits类所替代。目前支持这两种机制 [2],但最终value_type将被移除。
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] 请注意distance_type未定义用于 Output Iterators 或 Trivial Iterators。在 Output Iterators 的情况下,这是因为 Output Iterator 没有值类型:无法对 Output Iterator 进行解除引用并获取值。在 Trivial Iterators 的情况下,这是因为此概念仅为概念清晰而引入,以便将与某个对象相关的公理从与在范围上进行迭代相关的公理中分离。事实上,STL 未定义任何 Trivial Iterators 类型。虽然内置 C 指针可能是 Trivial Iterators,但 C 类型系统不允许区分 Trivial Iterators 指针和 Random Access Iterators 指针,这些指针进入 C 数组。因此,没有 Trivial Iterator 类别标记或迭代器基。
[2] 该iterator_traits类基于称为部分专业化的 C++ 功能。当今许多编译器未实现完整标准;特别是,许多编译器不支持部分专业化。如果您的编译器不支持部分专业化,那么您将无法使用iterator_traits, 并且您将必须继续使用函数iterator_category, distance_type和value_type。这是尚未移除这些函数的原因之一。