Oui. operator()
est appelé l'opérateur "appel de fonction", et permet à un objet d'être utilisable comme s'il s'agissait d'une fonction. Une telle classe est appelée un "foncteur".
Un modèle commun est de faire des foncteurs qui comparent deux choses pour l'égalité ou les relations, pour une utilisation dans tout ce qui nécessite un prédicat de comparaison. (Celui-ci pourrait être utilisable dans un std::map
, par exemple, il aurait un membre comme cmp_decr_int2 compare;
et il pourrait alors comparer la relation entre deux choses avec:. if (compare(x, y)) /* x is less than y, by some metric */
)
ORDONNE struct particulier deux peak2
de « s en comparant leur int2
membres. Il pourrait être mieux écrit:
struct cmp_decr_int2
{
// note const! vvvvv
bool operator() (peak2 a, peak2 b) const
{
return a.int2 > b.int2;
}
};
La fonction doit être const
parce qu'il n'a pas besoin de changer les membres (il n'y en a pas à changer.) const
-correctness est important *
Dans de nombreux cas, ces de foncteurs. sont utilisés dans des contextes où les arguments eux-mêmes sont const
, donc vous devriez soit prendre les arguments par valeur comme dans l'exemple ou par référence constante.
Vous devriez préférer passer les types par const-référence plutôt que par valeur, sauf si ce type est fondamental (float, unsigned int, double, etc.) ou plus petit qu'un void*
. Dans la plupart des cas, alors, vous passerez par const-référence:
struct cmp_decr_int2
{
// note const&: vvvvv v vvvvv v vvvvv
bool operator() (const peak2 & a, const peak2 & b) const
{
return a.int2 > b.int2;
}
};
* Si cela était utilisé comme prédicat dans un std::map
, par exemple, sans const
la carte ne serait pas en mesure de comparer deux choses tout dans une const
fonction.
Désolé encore, je m'excuse pour cela – ladyfafa
Merci pour l'édition :) – ladyfafa
Notez que dans C++ un 'struct' est juste une' classe' avec l'accessibilité par défaut étant 'public'. La question n'est pas spécifique à 'struct', pas plus que les réponses. –