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

What does "typename iterator_traits<InputIt>::difference_type" mean?

提问人:izaguirrejoe 提问时间:3/4/2020 最后编辑:Deduplicatorizaguirrejoe 更新时间:3/4/2020 访问量:941

问:

这是 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_typeunsigned int

C++ 算法 模板 iterator dependent-name

评论


答:

4赞 Deduplicator 3/4/2020 #1

好吧,如果不了解迭代器,你就不可能知道两个迭代器之间的差异。
举个例子,如果迭代器迭代文件中的字节:
文件大小是 64 位,但我们处于 32 位进程中。 行不通,可能也行不通。
std::size_tunsigned

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

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

评论

0赞 izaguirrejoe 3/4/2020
所以你是说 unsigned int 可能不够大,无法容纳计数?
1赞 Deduplicator 3/5/2020
这可能还不够。它也可能超出需要。
0赞 Lior 3/4/2020 #2

typename 告诉编译器 iterator_traits::d ifference_type 属于 class 类型。

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

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

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

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

希望这会有所帮助。

评论

0赞 JaMiT 3/4/2020
我认为问题更多的是关于“”而不是“”。(请注意问题的“如果我正在实现这个”部分。difference_typetypename