web-dev-qa-db-fra.com

Pourquoi utilisons-nous std :: function en C ++ plutôt que le pointeur de fonction C d'origine?

Quel est l'avantage de std::function<T1(T2)> sur l'original T1 (*)(T2)?

44
Michael Dorst

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);
}

exemple en direct sur Ideone.

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).

35
Xeo

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.

16
Benjamin Lindley

Outre l'aspect plus net et une syntaxe plus descriptive, std::function peut stocker n'importe quel objet appelable:

  • les fonctions
  • expressions lambda
  • lier des expressions
  • foncteurs

Sans oublier que le stockage, la copie et la liaison d'objets aux fonctions membres sont beaucoup plus faciles et plus intuitifs.

7
Shoe