На этот сайт сказано о категориях итераторов:
Вместо того, чтобы быть определенным определенными типами, каждая категория итератора определяется операциями, которые могут быть выполнены над ним. Это определение означает, что любой тип, который поддерживает необходимые операции, может быть использован в качестве итератора.
Является ли / может ли это каким-то образом применяться (аналогично интерфейсам Java, которые должны быть реализованы) перед выполнением?
Это связано с этот вопрос.
Все что угодно может объявить себя итератором определенной категории, без реализации всех необходимых методов.
Как это осуществляется? Очень просто. Если вы затем попытаетесь использовать эту категорию с методом или функцией, которая использует операторы, относящиеся к категории, поскольку они не определены, вы получите ошибку компиляции. Компилятор обеспечивает это.
Но практическое использование категорий итераторов происходит в обратном направлении. Шаблон предполагает, что итератор, который идентифицирует себя как определенную категорию, полностью реализует требования, и использует категорию итератора, чтобы проверить, какой это итератор, и принудительно вызвать ошибку компиляции.
Например (скажем, у меня в голове), скажем, вы хотите, чтобы ваша шаблонная функция использовалась только с итераторами с произвольным доступом:
template<typename iterator_category> class must_be_random_access_iterator;
template<> class must_be_random_access_iterator<std::random_access_iterator_tag> {
public:
typedef int or_else;
};template<typename iter_type> void some_func(iter_type iter)
{
typedef must_be_random_access_iterator<
typename std::iterator_traits<iter_type>::iterator_category
>::or_else or_else;
// ... more code
}
must_be_random_access_iterator
шаблон специализирован для std::random_access_iterator_tag
категория, в противном случае она не определена, поэтому передача некоторого другого типа итератора в функцию шаблона приведет к ошибке компиляции.
Другой, менее распространенный и более сложный подход заключается в использовании специализации или SFINAE обеспечить различные реализации одного и того же класса шаблона или метода, который зависит от категории параметра итератора.