Добавляя к предыдущему ответу, я просто хотел очистить предполагаемую путаницу относительно указателя функции и функции.
void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b));
int main() {
[...]
heapify(x, 9, shouldBeBefore(test[0], test[1]));
[...]
}
bool shouldBeBefore(const S & a, const S & b) {
return a.x < b.x;
}
shouldBeBefore
называет функцию, а также аргумент функции. Это добавляет некоторую путаницу. heapify
на самом деле разрешено принимать любую функцию с подписью bool(const S&, const S&)
, и имя должно указывать на это.
Для указателей на функцию всегда полезно добавить определение типа
using Comparator = bool(*)(const S&, const S&);
// typedef bool(*Comparator)(const S&, const S&); // or by typedef
Код будет выглядеть как
void heapify(S bt[], unsigned els, Comparator comparator);
int main() {
[...]
heapify(x, 9, shouldBeBefore(test[0], test[1]));
[...]
}
bool shouldBeBefore(const S & a, const S & b) {
return a.x < b.x;
}
и вы вызываете компаратор, как и любую другую функцию.
Определение указателя на функцию немного многословно. Вы также можете использовать std :: function, которая немного упрощает синтаксис
using Comparator = std::function<bool(const S&, const S&>>;
Преимущество заключается в том, что вы можете вызывать heapify с любого вызываемого абонента.