“ typename iterator_traits <InputIt> :: difference_type”是什么意思?

时间:2020-03-04 05:28:21

标签: c++ algorithm templates iterator dependent-name

这是https://devdocs.io/cpp/algorithm/count_if中count算法的示例实现:

template<class InputIt, class T>
typename iterator_traits<InputIt>::difference_type
    count(InputIt first, InputIt last, const T& value)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (*first == value) {
            ret++;
        }
    }
    return ret;
}

我的问题是typename iterator_traits<InputIt>::difference_type的意义是什么?
如果要实现这一点,我只会使用unsigned int来跟踪计数。

2 个答案:

答案 0 :(得分:2)

好吧,如果不了解有关迭代器的任何信息,就无法知道最好的足够大的类型,即两个迭代器之间的差异。 例如,如果迭代器迭代文件中的字节,该怎么办:
文件大小为64位,但是我们处于32位进程中。 std::size_t不起作用,很可能unsigned也不起作用。

因此,请std::iterator_traits通常提供合适的类型。

现在,我们必须在其中使用typename以确保编译器dependent qualified name std::iterator_traits<InputIt>::difference_type将是一种类型。这对于澄清两阶段查找很重要。

答案 1 :(得分:0)

typename告诉编译器iterator_traits :: difference_type是class类型。

考虑一个易于理解的示例:

class ...
{
    typename T::Something *p;
}

没有类型名,编译器可能会尝试创建一个静态成员,该成员将包含T :: Something乘以p;的结果。

在声明类型名时,编译器肯定会知道p是T :: Something类型的指针

希望这会有所帮助。

相关问题