La plupart des exemples se résument à des rappels: Vous appelez une fonction f()
passant l'adresse d'une autre fonction g()
, et f()
des appels g()
pour certains tâche spécifique. Si vous passez f()
l'adresse de l' h()
au lieu de cela, alors f()
ne h()
à la place.
En gros, c'est un moyen de paramétrer une fonction: une partie de son comportement n'est pas codée en dur dans f()
, mais dans la fonction de rappel. Les appelants peuvent faire f()
se comportent différemment en passant par les différentes fonctions de rappel. Un classique est - qsort()
de la bibliothèque C standard qui prend son critère de tri comme un pointeur vers une fonction de comparaison.
En C++, cela se fait souvent à l'aide de la fonction des objets (aussi appelé foncteurs). Ce sont des objets que la surcharge de l'opérateur d'appel de fonction, de sorte que vous pouvez les appeler comme si elles étaient une fonction. Exemple:
class functor {
public:
void operator()(int i) {std::cout << "the answer is: " << i << '\n';}
};
functor f;
f(42);
L'idée derrière cela est que, contrairement à un pointeur de fonction, un objet de fonction peut porter non seulement un algorithme, mais également des données:
class functor {
public:
functor(const std::string& prompt) : prompt_(prompt) {}
void operator()(int i) {std::cout << prompt_ << i << '\n';}
private:
std::string prompt_;
};
functor f("the answer is: ");
f(42);
Un autre avantage est qu'il est parfois plus facile de l'inclure des appels à la fonction des objets que des appels par le biais de pointeurs de fonction. C'est une des raisons pourquoi le tri en C++ est parfois plus rapide que le tri en C.