Я хочу сортировать вектор чисел в порядке desend/ascend, основываясь на значении флага. Что-то вроде этого:Что такое элегантное решение условного сравнения?
int main()
{
vector<int> numbers;
bool is_negatif = false;
// Do some stuff
sort(numbers.begin(), numbers.end(), is_negatif ? less<int>(): greater<int>());
}
К сожалению, такой код не будет компилироваться из-за различных типов меньше/greaters структур.
Я использую такой код:
template<class _Ty>
struct MyComparator
{
template <bool Less>
static bool compare(const _Ty& _Left, const _Ty& _Right);
template <>
static bool compare<true>(const _Ty& _Left, const _Ty& _Right)
{
return _Left < _Right;
}
template <>
static bool compare<false>(const _Ty& _Left, const _Ty& _Right)
{
return _Left > _Right;
}
};
Это использование:
sort(numbers.begin(), numbers.end(), is_negatif ? &MyComparator<int>::compare<true> : &MyComparator<int>::compare<false>);
Что такое элегантное решение такой проблемы?
Примечание: значение bool не известно во время компиляции!
'станд :: сортировки()' сортирует в порядке возрастания по умолчанию (с помощью 'станд :: less'). Почему бы не использовать это, а затем использовать 'std :: reverse()', если требуется порядок по убыванию? – Peter
Это приведет к дополнительной производительности – LmTinyToon
Зачем вам нужен тройной оператор? Просто передайте 'is_negatif' в качестве параметра шаблона. – SingerOfTheFall