Можно ли передать указатель на оператор в качестве аргумента, такого как указатель на функцию?
Я рассматриваю общий случай, ниже приведен лишь простой пример, с которым легко разобраться, но он вызвал мои мысли.
Например, я использую функцию 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<>{});