Подтвердить что ты не робот

Почему мы используем std:: function в С++ вместо исходного указателя функции C?

В чем преимущество std::function<T1(T2)> над исходным T1 (*)(T2)?

4b9b3361

Ответ 1

std::function может содержать больше указателей на функции, а именно функторы.

#include <functional>

void foo(double){}

struct foo_functor{
  void operator()(float) const{}
};

int main(){
  std::function<void(int)> f1(foo), f2((foo_functor()));
  f1(5);
  f2(6);
}

Пример Live на Ideone.

Как показывает пример, вам также не нужна точная та же подпись, если они совместимы (т.е. тип параметра std::function может быть передан в содержащуюся функцию/функтор).

Ответ 2

std::function может содержать объекты функции (включая lambdas), а также указатели на функции с правильной сигнатурой. Поэтому он более универсален.

Ответ 3

Помимо более чистого вида и более описательного синтаксиса std::function может хранить любой вызываемый объект:

  • Функции
  • лямбда-выражения
  • выражения привязки
  • функторы

Не говоря уже о том, что хранение, копирование и привязка объектов к функциям-членам намного проще и интуитивно понятнее.