Вы можете ввести параметр шаблона (здесь Pred
) для «всего, что можно вызвать с двумя параметрами»:
template <typename Iter, typename Pred>
void mysort(Iter begin, Iter end, Pred predicate)
{
--end;
// ...
if (predicate(*begin, *end))
{
// ...
}
// ...
}
Затем вы можете передать либо старые добрые указатели на функции C, либо объекты функций C ++:
bool function(int x, int y)
{
return x < y;
}
struct function_object
{
bool operator()(int x, int y)
{
return x < y;
}
};
int main()
{
int numbers[] = {543, 6542654, 432514, 54, 45, 243};
mysort(numbers + 0, numbers + 6, &function);
mysort(numbers + 0, numbers + 6, function_object());
}
Как видите, функциональный объект - это объект класса, который перегружает operator()
соответствующим образом.