Это хорошая идея, но склонная к сбою - учтите, например, что vector
имеет аргумент шаблона Allocator
, который по умолчанию установлен, и вы редко указываете себя, но всегда присутствует.Итак, ваш самый простой вариант использования более сложен, чем предполагалось, и кто знает, какие сюрпризы могут преподнести другие контейнеры?
Вместо этого просто используйте тип итератора напрямую.Если код внутри функции работает с итератором, то отлично.Если нет, то он не скомпилируется (или ваши пользователи нарушили задокументированное предварительное условие).Если это работает с чем-то, что вы лично не называете «итератором», то это имеет значение?Это работает!
template <typename Iterator>
auto proof(const Iterator& it1, const Iterator& it2)
{
return std::distance(it1, it2);
}
Конечно, я не рекомендую писать такую функцию, если только она не делает что-то более существенное, чем делегирование std::distance
;например, ваш тип возврата был неправильным.