【问题标题】:What does "typename iterator_traits<InputIt>::difference_type" mean?“typename iterator_traits<InputIt>::difference_type”是什么意思?
【发布时间】:2020-06-16 13:32:02
【问题描述】:

这是来自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&lt;InputIt&gt;::difference_type 的意义是什么?
如果我要实现这个,我会简单地使用unsigned int 来跟踪计数。

【问题讨论】:

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


    【解决方案1】:

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

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

    现在,我们必须在那里使用typename 来确保编译器dependent qualified name std::iterator_traits&lt;InputIt&gt;::difference_type 将是一个类型。这对于澄清两阶段查找很重要。

    【讨论】:

    • 所以你是说 unsigned int 可能不够大来容纳计数?
    • 这可能还不够。它也可能超出需要。
    【解决方案2】:

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

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我认为这个问题更多的是关于“difference_type”而不是“typename”。 (注意问题的“如果我正在实施这个”部分。)
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    相关资源
    最近更新 更多