Это шаг оптимизации для шаблонных предикатов.
Дело не в том, что функтор проще в использовании, чем функция. И то, и другое работает примерно одинаково в контексте boost и STL.
Чем они отличаются, это в шаблонах.
Представьте себе тривиальную шаблонную функцию, которая требует предикат
template< typename Predicate >
void DoSomething( Predicate func )
{
func();
}
Использование функции приведет к созданию экземпляра шаблона с указателем на функцию .
void changeString();
DoSomething( &changeString );
// This creates a template instantiation expecting a pointer to a function.
// The specific pointer may be evaluated at runtime.
// void DoSomething( void(func*)() );
Использование функтора создаст экземпляр экземпляра шаблона с определенным типом функтора .
struct changeString
{
void operator() ();
}
DoSomething( changeString() );
// This creates a template instantiation expecting an instance of the struct.
// The exact function being called is now known at compile time.
// void DoSomething( changeString );
С помощью функтора конкретные функции теперь четко определены, и передаваемая структура, вероятно, не используется и может быть оптимизирована.