В чем преимущество std::function<T1(T2)>
над исходным T1 (*)(T2)
?
Почему мы используем std:: function в С++ вместо исходного указателя функции C?
Ответ 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);
}
Как показывает пример, вам также не нужна точная та же подпись, если они совместимы (т.е. тип параметра std::function
может быть передан в содержащуюся функцию/функтор).
Ответ 2
std::function
может содержать объекты функции (включая lambdas), а также указатели на функции с правильной сигнатурой. Поэтому он более универсален.
Ответ 3
Помимо более чистого вида и более описательного синтаксиса std::function
может хранить любой вызываемый объект:
- Функции
- лямбда-выражения
- выражения привязки
- функторы
Не говоря уже о том, что хранение, копирование и привязка объектов к функциям-членам намного проще и интуитивно понятнее.