Я потратил целый день на поиски решения, только чтобы понять, что последняя версия Sierra не поставляется с установленным XQuartz https://support.apple.com/en-gb/HT201341 . После установки ( https://www.xquartz.org/ ) все работает.
Это этап оптимизации шаблонных предикатов.
Дело не в том, что функтор проще в использовании, чем функция. Оба работают примерно одинаково в контекстах 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 );
С помощью функтора, конкретная функциональность теперь четко определена, и передаваемая структура, вероятно, не используется и может быть оптимизирована.
Структура с оператором () часто называется функтором, эффективно действующим как «объект функции». Вы можете использовать эти функторы со многими API, особенно с STL, более легко и надежно, чем вы можете использовать типичные указатели на функции. Функторы, являющиеся объектами, могут содержать состояние и параметризоваться во время построения для создания автономного специализированного обработчика.
Я предполагаю, что часто у вас есть код во внешнем классе, который хочет использовать эти библиотечные функции (т.е. std :: for_each) , и поэтому разработали этот шаблон, чтобы сделать его тривиальным. Если вы никогда не используете функторы, то да, этот синтаксис бессмыслен и труден для чтения (и его можно заменить, как вы предлагаете).
Изменить: вам может понравиться Вопрос 317450 об операторе ().