Я рефакторил некоторый код и обнаружил, что есть два места, которые могут быть написаны с одним и тем же кодом, за исключением того, что компаратор набора less
в в одном месте и больше<двойное>
в другом. Что-то вроде:
double MyClass::Function1(double val)
{
std::set<double, less<double> > s;
// Do something with s
}
double MyClass::Function2(double val)
{
std::set<double, greater<double> > s;
// Do the same thing with s as in Function1
}
Итак, я подумал сделать:
double MyClass::GeneralFunction(double val, bool condition)
{
if(condition)
{
// Select greater as comparator
}
else
{
// Select less as comparator
}
set<double, comparator> s;
// common code
}
Я заставил это работать, используя свои собственные функции компаратора, например:
bool my_greater(double lhs, double rhs)
{
return lhs > rhs;
}
bool my_less(double lhs, double rhs)
{
return lhs < rhs;
}
double MyClass::GeneralFunction(double val, bool condition)
{
typedef bool(*Comparator) ( double, double);
Comparator comp = &my_less;
if (condition)
{
comp = &my_greater;
}
std::set<double, Comparator > s(comp);
//....
}
Но я хотел бы использовать встроенные. Проблема в том, что я не знаю, как объявить компаратор и назначить ему встроенные предикаты.
Будем признательны за любую помощь.