I recently discovered that in C++ you can overload the "function call" operator, in a strange way in which you have to write two pair of parenthesis to do so:
class A {
int n;
public:
void operator ()() const;
};
And then use it this way:
A a;
a();
When is this useful?
There's little more than a syntactic gain in using operator() until you start using templates. But when using templates you can treat real functions and functors (classes acting as functions) the same way.
A algorithm implemented using a template doesn't care whether the thing being called is a function or a functor, it cares about the syntax. Either standard ones (e.g. for_each()) or your own. And functors can have state, and do all kinds of things when they are called. Functions can only have state with a static local variable, or global variables.
I see potential to yet one exotic use:
Suppose you have object of unknown type and have to declare another variable of same type, like this:
When such pattern used extensively, decltype become very annoying. This case can occur when using some smart type system that automatically invent type of result of functions and operators based on types of arguments.
Now, if each specialization of each type of that type system equipped with magic definition of
operator()
like this:decltype()
no more needed, you can write simply:Because operator() of object redirects to constructor of its own type.
For example for implementing generators:
This can be used to create "functors", objects that act like functions:
The above prints
20
. The Wikipedia article linked above gives more substantial examples.If you're making a class that encapsulates a function pointer, this might make the usage more obvious.