"typename iterator_traits<InputIt>::difference_type" 是什么意思?
What does "typename iterator_traits<InputIt>::difference_type" mean?
这是 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
来跟踪计数。
好吧,如果不了解迭代器,就无法知道两个迭代器之间的区别。
例如,如果迭代器迭代文件中的字节会怎样:
文件大小为 64 位,但我们处于 32 位进程中。 std::size_t
不会工作,很可能 unsigned
也不会。
因此,要求 std::iterator_traits
提供一个合适的类型。
现在,我们必须在那里使用 typename
来确保编译器 dependent qualified name std::iterator_traits<InputIt>::difference_type
将是一个类型。澄清两阶段查找很重要。
typename 告诉编译器 iterator_traits::difference_type 是 class.
类型
考虑一个更容易理解的例子:
class ...
{
typename T::Something *p;
}
如果没有类型名,编译器可能会尝试创建一个静态成员,它将包含 T::Something 乘以 p;
的结果
而当你声明 typename 时,编译器肯定知道 p 是类型 T::Something
的指针
希望对您有所帮助。
这是 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
来跟踪计数。
好吧,如果不了解迭代器,就无法知道两个迭代器之间的区别。
例如,如果迭代器迭代文件中的字节会怎样:
文件大小为 64 位,但我们处于 32 位进程中。 std::size_t
不会工作,很可能 unsigned
也不会。
因此,要求 std::iterator_traits
提供一个合适的类型。
现在,我们必须在那里使用 typename
来确保编译器 dependent qualified name std::iterator_traits<InputIt>::difference_type
将是一个类型。澄清两阶段查找很重要。
typename 告诉编译器 iterator_traits::difference_type 是 class.
类型考虑一个更容易理解的例子:
class ...
{
typename T::Something *p;
}
如果没有类型名,编译器可能会尝试创建一个静态成员,它将包含 T::Something 乘以 p;
的结果而当你声明 typename 时,编译器肯定知道 p 是类型 T::Something
的指针希望对您有所帮助。