Какой смысл этого шаблона: использование структуры для содержания отдельного метода

Я потратил целый день на поиски решения, только чтобы понять, что последняя версия Sierra не поставляется с установленным XQuartz https://support.apple.com/en-gb/HT201341 . После установки ( https://www.xquartz.org/ ) все работает.

8
задан James Hopkin 28 May 2009 в 16:38
поделиться

2 ответа

Это этап оптимизации шаблонных предикатов.

Дело не в том, что функтор проще в использовании, чем функция. Оба работают примерно одинаково в контекстах 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 );

С помощью функтора, конкретная функциональность теперь четко определена, и передаваемая структура, вероятно, не используется и может быть оптимизирована.

4
ответ дан 5 December 2019 в 08:25
поделиться

Структура с оператором () часто называется функтором, эффективно действующим как «объект функции». Вы можете использовать эти функторы со многими API, особенно с STL, более легко и надежно, чем вы можете использовать типичные указатели на функции. Функторы, являющиеся объектами, могут содержать состояние и параметризоваться во время построения для создания автономного специализированного обработчика.

Я предполагаю, что часто у вас есть код во внешнем классе, который хочет использовать эти библиотечные функции (т.е. std :: for_each) , и поэтому разработали этот шаблон, чтобы сделать его тривиальным. Если вы никогда не используете функторы, то да, этот синтаксис бессмыслен и труден для чтения (и его можно заменить, как вы предлагаете).

Изменить: вам может понравиться Вопрос 317450 об операторе ().

16
ответ дан 5 December 2019 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: