Предикат - это правильная вещь, которую можно найти, поэтому вы можете прийти к неясностям.
Рассмотрим find_if
переименовано find
, тогда у вас есть:
template <typename InputIterator, typename T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
template <typename InputIterator, typename Predicate>
InputIterator find(InputIterator first, InputIterator last, Predicate pred);
Что делать тогда с:
find(c.begin(), c.end(), x); // am I finding x, or using x to find?
Вместо того, чтобы пытаться придумать какое-то замысловатое решение для дифференциации на основе x
(что не всегда может быть сделано *), проще просто отделить их.
* Это было бы неоднозначно, независимо от того, какая у вас схема или насколько она мощная †:
struct foo
{
template <typename T>
bool operator()(const T&);
};
bool operator==(const foo&, const foo&);
std::vector<foo> v = /* ... */;
foo f = /* ... */;
// f can be used both as a value and as a predicate
find(v.begin(), v.end(), f);
† Сохраняйте умственное чтение.