Да.operator()
называется оператором "вызова функции" и позволяет использовать объект, как если бы он был функцией.Такой класс называется «функтором».
Распространенным шаблоном является создание функторов, которые сравнивают две вещи для равенства или отношений, для использования во всем, что требует предиката сравнения.(Этот можно использовать в std::map
, например. Он будет иметь член типа cmp_decr_int2 compare;
, а затем он может сравнить отношение между двумя вещами с: if (compare(x, y)) /* x is less than y, by some metric */
)
Этот конкретный заказ структурыдва peak2
, сравнивая их int2
членов.Лучше было бы написать так:
struct cmp_decr_int2
{
// note const! vvvvv
bool operator() (peak2 a, peak2 b) const
{
return a.int2 > b.int2;
}
};
Функция должна быть const
, потому что не нужно менять какие-либо элементы (нет ни одного, чтобы изменить.) const
-корректность важно. *
Во многих случаях эти функторы используются в тех случаях, когда сами аргументы равны const
, поэтому вы должны принимать аргументы по значению, как в примере, или по константе.
Вы должны предпочитать передавать типы по const-reference, а не по by-value, кроме случаев, когда этот тип является фундаментальным (float, unsigned int, double и т. Д.) Или меньше, чем void*
.В большинстве случаев вы будете передавать по const-reference:
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;
}
};
* Если бы это использовалось в качестве предиката в std::map
, например, без const
, карта не будетне может сравнивать две вещи, находясь в пределах функции const
.