std :: function вместо шаблонов для предикатов

Многие стандартные библиотечные алгоритмы принимают предикатные функции. Однако тип этих предикатов является произвольным предоставленным пользователем параметром шаблона. Почему в C ++ 11 не указано, что они принимают определенный тип, напримерstd::function вместо? Например:

template< class InputIt >
InputIt find_if( InputIt first, InputIt last,
             std::function<bool()> p );

Разве это не использование вместо шаблона в качестве типа аргумента не намного более чистым?