find
нельзя перегрузить, чтобы получить унарный предикат вместо значения, потому что это необязательный параметр шаблона. Поэтому, если бы вы вызвали find(first, last, my_predicate)
, была бы потенциальная неоднозначность, хотите ли вы, чтобы предикат оценивался для каждого члена диапазона, или вы хотите найти элемент диапазона, равный самому предикату (это может быть диапазон предикатов, для всех разработчиков стандартных библиотек, которые знают или заботятся, или value_type
итератора может быть конвертируемым как в тип предиката, так и в его argument_type
). Отсюда необходимость для find_if
перейти под отдельным именем.
find
мог быть перегружен, чтобы принять необязательный двоичный предикат, в дополнение к искомому значению. Но захват значений в функторах, как вы уже сделали, является настолько стандартной техникой, что я не думаю, что это будет огромный выигрыш: это, безусловно, никогда не нужно, так как вы всегда можете достичь того же результата с find_if
.
Если вы получили find
, который вы хотели, вам все равно пришлось бы написать функтор (или использовать boost), поскольку <functional>
не содержит ничего для разыменования указателя. Тем не менее, ваш функтор будет немного проще в качестве двоичного предиката, либо вы можете использовать указатель на функцию, так что это будет скромный выигрыш. Так что я не знаю, почему это не предусмотрено. Учитывая фиаско copy_if
, я не уверен, что есть много смысла предполагать, что всегда есть веские причины для недоступных алгоритмов: -)