Quel est l'avantage de std::function<T1(T2)>
sur l'original T1 (*)(T2)
?
std::function
peut contenir plus que des pointeurs de fonction, à savoir foncteurs .
#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);
}
Comme le montre l'exemple, vous n'avez pas non plus besoin de la même signature exacte, tant qu'ils sont compatibles (c'est-à-dire le type de paramètre std::function
peut être passé à la fonction/fonction contenue).
std::function
peut contenir des objets de fonction (y compris des lambdas), ainsi que des pointeurs de fonction avec la signature correcte. Il est donc plus polyvalent.
Outre l'aspect plus net et une syntaxe plus descriptive, std::function
peut stocker n'importe quel objet appelable:
Sans oublier que le stockage, la copie et la liaison d'objets aux fonctions membres sont beaucoup plus faciles et plus intuitifs.