Можно ли передать указатель на оператор в качестве аргумента, такого как указатель на функцию?

Я рассматриваю общий случай, ниже приведен лишь простой пример, с которым легко разобраться, но он вызвал мои мысли.

Например, я использую функцию sort() <algorithm>. Вместо определения функции как

bool cmp (int n1, int n2)
{
    return n1 > n2;
}

а также

sort (arr, arr + N, cmp);

в основной функции мне интересно, могу ли я передать указатель на оператор >, так же, как я делаю указатель на функцию, в функцию сортировки. Если да, то как мне это реализовать?

Ответ 1

Вы не можете получить указатель на встроенный оператор. Но, к счастью, стандартная библиотека предоставляет функциональные объекты для всех стандартных операторов. В вашем случае это имя объекта - std::greater

sort (arr, arr + N, std::greater<int>{});

Начиная с С++ 14, вы можете даже опустить тип аргумента, и это будет определено из того, как используется объект:

sort (arr, arr + N, std::greater<>{});

А начиная с С++ 17, пустой <> тоже можно опустить:

sort (arr, arr + N, std::greater{});

Ответ 2

Вы можете использовать лямбда-функцию

sort(arr,arr + N,[](const int& i1,const int& i2) -> bool
    {
     if (i1 < i2) return true;
    return false;
    });

Ответ 3

Вы не можете этого сделать, но вы можете использовать лямбду непосредственно внутри сортировки или сохранить саму лямбду в переменной, если вам нужно передать компаратор

sort (arr, arr + N, [](int a, int b){ return a > b; });

или же

auto comp = [](int a, int b){ return a > b; };
sort (arr, arr + N, comp);

или, как предложено, вы можете использовать std::greater

sort (arr, arr + N, std::greater<>{});