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