Пара точек:
- Для
isEqualToEndOfMap
нет необходимости принимать итератор по ссылке. - Вы можете использовать
const_iterator
в качестве типа аргумента в isEqualToEndOfMap
. При вызове функции можно использовать объект типа iterator
.
template<template <typename...> class Map, typename K, typename T>
bool isEqualToEndOfMap(typename Map<K, T>::const_iterator it, const Map<K, T> &map) {
return it == map.end();
}
Это должно работать в обоих случаях использования в опубликованном коде.
Обновление в ответ на комментарий ОП.
В комментарии вы написали:
Но даже если это дешево, почему бы не избежать этого?
Вы должны изучить свои варианты и решить, какой из них лучше всего подходит для ваших нужд.
В дополнение к тому, что я уже предложил, я могу вспомнить еще два варианта.
Вариант 2
Есть пара перегрузок, одна для const_iterator
и одна для iterator
.
template<template <typename...> class Map, typename K, typename T>
bool isEqualToEndOfMap(const typename Map<K, T>::const_iterator &it, const Map<K, T> &map) {
return it == map.end();
}
template<template <typename...> class Map, typename K, typename T>
bool isEqualToEndOfMap(const typename Map<K, T>::iterator &it, const Map<K, T> &map) {
return it == map.end();
}
Это не лучше, чем первый вариант, так как вам нужно поддерживать по существу дублированный код.
Опция 3
Использовать const_iterator&
в качестве типа аргумента вместо const_iterator
.
template<template <typename...> class Map, typename K, typename T>
bool isEqualToEndOfMap(const typename Map<K, T>::const_iterator &it, const Map<K, T> &map) {
return it == map.end();
}
Это сохраняет вам копию, когда функция вызывается с const_iterator
, но все равно требуется копия, временный объект, когда он вызывается с iterator
объектом.
Вы могли бы потенциально использовать эту опцию, но это не idiomati c. Объекты-итераторы предназначены для использования почти так, как они считаются указателями и передаются по значению.
Я бы порекомендовал придерживаться первого варианта.