在我看来,这种用法std::find_if
有点误导。当我阅读这段代码时,我不希望出现任何副作用,我只是希望找到一个服务器名称。结果被丢弃的事实find_if
也让我怀疑代码是否真的正确。也许谓词的另一个名称会使意图更清晰,但我认为问题更根本。
对于大多数人来说,find_if
是一种查询算法,而不是一种修改算法。尽管您实际上并没有修改迭代的值,但您正在修改应用程序的全局状态(在这种情况下,您甚至可能修改远程服务器的状态)。
在这种情况下,我可能会坚持使用手动循环,尤其是现在 C++11 引入了基于范围的 for 循环:
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;
// }
}
}
但也许我过于纯粹了:)!