42 votes

Pourquoi utilise-t-on std::function en C++ plutôt que le pointeur de fonction original du C ?

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

34voto

Xeo Points 69818

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 concret sur Ideone.

Comme le montre l'exemple, il n'est pas non plus nécessaire d'avoir exactement la même signature, pour autant qu'elles soient compatible (c'est-à-dire le type de paramètre de std::function peuvent être passés à la fonction / au foncteur contenu).

16voto

Benjamin Lindley Points 51005

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.

7voto

Jefffrey Points 31698

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

  • fonctions
  • expressions lambda
  • lier les expressions
  • foncteurs

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X