web-dev-qa-db-ja.com

C ++ 11がfind()をオーバーロードする代わりにfind_if()を追加したのはなぜですか?

なぜc ++ 11は、単に既存のfind_if()をオーバーロードするのではなく、個別のfind()を追加したのですか?
関数のオーバーロードで十分ではないでしょうか?

2
Jankovsky144

2つの関連する関数 を見てみましょう:

_template <class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value);

template <class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);
_

どちらにも最初にイテレーター範囲があり、イテレーターがその中に返されることを確認します(オーバーロードできないことに注意してください)。

3番目と最後に、find()には比較する値がありますが、find_if()には単項述語(範囲の単一の要素で呼び出すことができるオブジェクトがあり、boolに変換可能なものを返します)。

さて、私たちが2つのうちどちらを持っているのかわからない場合、どのように区別できますか?
残念ながら、一般的なケースではそうすることはできません。ほとんどの引数は多くても1つの役割を果たしますが、オプションで競合するセマンティクスを使用して両方を満たす役割を作成することは簡単です。

曖昧さをなくすための追加の議論は、不可能ではありませんが、面倒で非効率的であり、コンパイル時のチェックを低下させます。
したがって、最終的には、別の関数名を選択する必要があります。

12
Deduplicator