0

这是来自https://devdocs.io/cpp/algorithm/count_if的计数算法的示例实现:

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跟踪计数。

4

2 回答 2

2

好吧,如果不了解迭代器,您就无法知道两个迭代器之间的差异的最佳足够大类型。
例如,如果迭代器迭代文件中的字节会怎样:
文件大小是 64 位,但我们处于 32 位进程中。std::size_t不会工作,可能unsigned也不会。

因此,要求std::iterator_traits一般提供合适的类型。

现在,我们必须使用typename它来确保编译器依赖的限定名称 std::iterator_traits<InputIt>::difference_type将是一个类型。这对于澄清两阶段查找很重要。

于 2020-03-04T05:38:34.420 回答
0

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

考虑一个更容易理解的例子:

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

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

而当你声明 typename 时,编译器肯定知道 p 是 T::Something 类型的指针

希望这可以帮助。

于 2020-03-04T05:41:43.827 回答