Что означает "typename iterator_traits <InputIt>:: diff_type"? - PullRequest
0 голосов
/ 04 марта 2020

Это пример реализации алгоритма подсчета из 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 для отслеживания счета.

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Ну, вы не можете знать лучший достаточно большой тип разницы между двумя итераторами, ничего не зная об итераторах.
Например, что если итератор итерирует байты в файле:
Размер файла 64 бит, но мы находимся в 32-битном процессе. std::size_t не будет работать, скорее всего, unsigned тоже не будет.

Таким образом, попросите std::iterator_traits в общем случае предоставить подходящий тип.

Теперь мы должны использовать typename чтобы гарантировать компилятору, что зависимое квалифицированное имя std::iterator_traits<InputIt>::difference_type будет типом. Это важно уточнить для двухфазного поиска.

0 голосов
/ 04 марта 2020

typename сообщает компилятору, что iterator_traits :: diff_type относится к типу class.

Рассмотрим более простой для понимания пример:

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

Без typename компилятор может попытаться создать stati c член, который будет содержать результат T :: Something, умноженный на p;

, в то время как при указании typename компилятор наверняка будет знать, что p является указателем типа T :: Something

Надеюсь, это поможет.

...