sbi explained it nicely here:
Most examples boil down to callbacks: You call a function f()
passing the address of another function g()
, and f()
calls g()
for some specific task. If you pass f()
the address of h()
instead, then f()
will call back h()
instead.
Basically, this is a way to parametrize a function: Some part of
its behavior is not hard-coded into f()
, but into the callback
function. Callers can make f()
behave differently by passing
different callback functions. A classic is qsort()
from the C
standard library that takes its sorting criterion as a pointer to a
comparison function.
In C++, this is often done using function objects (also called
functors). These are objects that overload the function call operator,
so you can call them as if they were a function. Example:
class functor {
public:
void operator()(int i) {std::cout << "the answer is: " << i << '\n';}
};
functor f;
f(42);
The idea behind this is that, unlike a function pointer, a function
object can carry not only an algorithm, but also data:
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);
Another advantage is that it is sometimes easier to inline calls to
function objects than calls through function pointers. This is a
reason why sorting in C++ is sometimes faster than sorting in C.