STL中实现 iterator trail 的编程技巧(2)

C++ 中允许 template 的全特化(亦即为某型别如 int* 提供另一种定义)和偏特化(亦即提供另一个定义,其自身仍为模板化的。具体可参考 《C++ primer》)。在这个例子中,我们需要针对每一种指针类型做出另一种定义,因此我们需要偏特化:
template <class T>
struct iterator_traits<T*> {
    typedef T value_type;   
};

现在,当我们面对普通的指针时,也可以像对待迭代器一样,使用相同的方法来取用它的 Associated Type。

主要的问题已经解决了,但是还有一个细节问题需要提出来讨论一下:constant iterator 的 value_type 是什么?考虑如下例子:
iterator_traits<const int*>::value_type

根据我们之前定义的 Iterator_traits value_type 将会是 const int 而非 int。我们已经针对 T* 的参数将 iterator_traits 特化,但当 T 是 const int 时,const int * 会符合 T* ,这不是我们期待的结果。

我们只需要另外设计一个版本的偏特化,就能轻而易举的解决这个问题:
template<class T>
struct iterator_traits<cosnt T*> {
    typedef T value_type;
};

现在我们有了三种不同的 itertaor_traits 版本。一个是针对类型为 T 的参数,一个是 T * ,另一个是 const T * 的参数。当你写下 iterator_traits<const int*> 时,原则上他符合任何一个版本,不会有歧义的情况发生。因为 C++ 编译器总能选出最能明确匹配的版本。

直到到现在,我们有了某种机制,让我们得以使用某个 iterator 的 value_type 来撰写算法。

举个例子,以下的泛型函数用来计算 nonempty range 内的数值总和:
template <class InputIterator>
typename iterator_traits<InputIterator>::value_type
sum_nonempty(InputIterator first,InputIterator last) {
    typename iterator_traits<InputIterator>::value_type result = *first;
    for (;first != last; ++first)
        result += *first;
    return result;
}

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/37cf67c70d390174f0cda8e33d55334e.html