Byłem refactoring niektóre kod i stwierdził, że istnieją dwa miejsca, które można zapisać z tym samym kodem, z wyjątkiem komparator zestawu jest less<double>
w jednym miejscu i greater<double>
w drugim. Coś jak:std :: set wybierz mniej lub więcej komparatora w czasie wykonywania
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
}
Pomyślałem więc robić:
double MyClass::GeneralFunction(double val, bool condition)
{
if(condition)
{
// Select greater as comparator
}
else
{
// Select less as comparator
}
set<double, comparator> s;
// common code
}
Zrobiłem to działa przy użyciu moje własne funkcje porównawcze, tak:
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);
//....
}
Ale chciałbym używać wbudowanych. Problem polega na tym, że nie wiem, jak zadeklarować komparatora i przypisać mu wbudowane predykaty.
Każda pomoc zostanie bardzo doceniona.
Dzięki! Naprawdę nie potrzebowałem sprawdzania w czasie wykonywania, więc mogłem wybrać komparator w programie wywołującym. – MikMik