私の意見では、この の使用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;
// }
}
}
しかし、おそらく私は過度に純粋主義的です:)!