Comment peut-il être utile à la surcharge de la fonction “appel” de l'opérateur?
J'ai récemment découvert qu'en C++, vous pouvez surcharger la fonction "appel" de l'opérateur, d'une manière étrange dans lequel vous devez écrire deux paires de parenthèses pour le faire:
class A {
int n;
public:
void operator ()() const;
};
Et ensuite l'utiliser de cette façon:
A a;
a();
Quand est-ce utile?
- Lisez à propos de la fonction des objets. en.wikipedia.org/wiki/Function_object
Vous devez vous connecter pour publier un commentaire.
Cela peut être utilisé pour créer des "foncteurs", des objets qui se comportent comme des fonctions:
Ci-dessus imprime
20
. La Wikipedia article lié ci-dessus donne plus importante des exemples.Il y a un peu plus d'un morphosyntaxique à l'aide de l'opérateur() jusqu'à ce que vous commencez à l'aide de modèles. Mais lors de l'utilisation de modèles, vous pouvez traiter les fonctions réelles et les foncteurs (classes agissant comme des fonctions) de la même manière.
Un algorithme mis en œuvre à l'aide d'un modèle ne se soucie pas de savoir si la chose est une fonction ou d'un foncteur, il se soucie de la syntaxe. Standard (p. ex. for_each()) ou sur votre propre. Et foncteurs peuvent avoir l'état, et de faire toutes sortes de choses quand ils sont appelés. Les fonctions ne peuvent avoir l'état avec une variable locale statique, ou des variables globales.
Si vous êtes de prendre une classe qui encapsule un pointeur de fonction, cela pourrait faire l'usage le plus évident.
Le compilateur peut également incorporer le foncteur et l'appel de la fonction. Il ne peut pas inline un pointeur de fonction, cependant. De cette façon, à l'aide de l'appel de la fonction opérateur peut améliorer sensiblement les performances lorsqu'il est utilisé par exemple avec le standard C++ bibliothèque d'algorithmes.
Par exemple pour la mise en œuvre de générateurs:
Je vois le potentiel pour encore un exotique utilisation:
Supposons que vous avez un objet de type inconnu et de déclarer à une autre variable de même type, comme ceci:
Lorsqu'un tel motif est utilisé de façon intensive, decltype devenir très ennuyeux.
Ce cas peut se produire lors de l'utilisation de certains type intelligent qui règle automatiquement les inventer type de résultat de fonctions et opérateurs sur les types d'arguments.
Maintenant, si à chaque domaine de spécialisation de chaque type de ce type de système équipé d'
la magie de la définition de
operator()
comme ceci:decltype()
plus nécessaires, vous pouvez écrire simplement:Parce que l'opérateur() de l'objet redirige vers le constructeur de son propre type.