Если у вас всегда есть что-то в контейнере, используйте std :: prev на конце, чтобы получить итератор перед ним, а затем уменьшите это. Вот как я бы написать блок кода:
std::string getName(Foos::const_iterator begin, Foos::const_iterator end)
{
// Assert: begin != end.
return boost::apply_visitor(Detail::NameGetterForFoo(),*std::prev(end));
}
Edit: также контейнеры поддерживают функцию члена .Задняя(), а также. Если вы перейдете в свой контейнер вместо диапазона итератора, вы можете использовать его вместо этого. Это может быть полезно, поскольку в этом блоке кода все, что вам действительно нужно, это последний элемент контейнера. например
std::string getName(Foos const& foos)
{
// Assume Foos is a standard container with front() and back() and that
// it is non-empty.
return boost::apply_visitor(Detail::NameGetterForFoo(), foos.back());
}
Вы знаете, что '--end' изменяет итератор' end', правильно? Это не то же самое, что '* (end-1)' –
Обратите внимание, что это уменьшит исходный итератор. Вы можете перейти по значению или использовать '* std :: prev (end)'. –