Couldn't find_if just be an overload of find ? That's how std::binary_search and friends do it... A predicate is a valid thing to find, so you could arrive at ambiguities. Consider find_if is renamed find , then you have: 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); What shall be done, then, with: find(c.begin(), c.end(), x); // am I finding x, or using x to find? Rather than try to come