На мой взгляд, использование std::find_if
немного вводит в заблуждение. Когда я читаю этот фрагмент кода, я не ожидаю каких-либо побочных эффектов, я просто ожидаю, что будет найдено имя сервера. Тот факт, что результат find_if
отбрасывается, также заставляет меня задуматься, действительно ли код верен. Возможно, другое имя предиката прояснит намерение, но я думаю, что проблема более фундаментальная.
Для большинства людей find_if
- это алгоритм , запрашивающий , а не модифицирующий алгоритм . Даже если вы на самом деле не изменяете значения, повторяемые на основе, вы изменяете глобальное состояние вашего приложения (в этом случае вы даже можете изменять состояние удаленных серверов).
В таком случае я бы, вероятно, придерживался ручного цикла, особенно теперь, когда в C ++ 11 введены циклы на основе диапазона:
for (std::string const & name : serverNames)
{
if (ContactServer(name)) break;
}
Другим решением было бы заключить это в функцию с именем, передающим более ясное намерение, например apply_until
или что-то в этом роде:
template <typename InputIterator, typename Function>
void apply_until(InputIterator first, InputIterator last, Function f)
{
std::find_if(first, last, f);
// or
// while (first != last)
// {
// if (f(*first)) break;
//
// ++first;
// }
}
}
Но, возможно, я чрезмерно пуристичен:)!