Я проверяю, лежит ли число между двумя значениями. Я оставляю на усмотрение пользователя выбор, должно ли логическое сравнение включать equal to
в один (или оба) из пределов или нет. Они устанавливают это, определяя struct
, который содержит два значения края и какой оператор сравнения использовать:
typedef struct {
double low;
double high;
bool low_equal; //false if a greater than operator (`>`) should be used, true if a greater-than-or-equal-to (`>=`) operator should be used
bool high_equal; //Same as low_equal but for a less-than operator
} Edges;
Создается массив Edges
(обозначенный ниже bins
), и для каждого входа value
я проверяю, находится ли он в пределах границ ячейки. Однако, чтобы использовать нужную пару операторов сравнения, я получил этот отвратительный условный блок:
if (bins[j].low_equal && bins[j].high_equal)
{
if (value >= bins[j].low && value <= bins[j].high)
{
break;
}
}
else if (bins[j].low_equal)
{
if (value >= bins[j].low && value < bins[j].high)
{
data[i] = bins[j].value;
break;
}
}
else if (bins[j].high_equal)
{
if (datum > bins[j].low && datum <= bins[j].high)
{
break;
}
}
else
{
if (value > bins[j].low && value < bins[j].high)
{
break;
}
}
Есть лучший способ сделать это? Можно ли как-то настроить используемые операторы и потом просто вызывать их?
std::function
и эквиваленты функций оператора, например.std::less
,std::less_equal
и т. д. - person πάντα ῥεῖ   schedule 03.01.2016