在没有大条件块的情况下更改比较运算符
Change comparison operators without large conditional block
我正在测试一个数字是否位于两个值之间。我让用户选择逻辑比较是否应在任一(或两者)限制上包含 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
,我检查它是否位于 bin 边缘内。
但是,为了使用所需的一对比较运算符,我最终得到了这个可怕的条件块:
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;
}
}
有更好的方法吗?我能以某种方式设置要使用的运算符,然后调用它们吗?
你可以在函数上使用指针
bool less(double lhs, double rhs) { return lhs < rhs; }
bool less_or_equal(double lhs, double rhs) { return lhs <= rhs; }
using comp_double = bool(double, double);
然后
comp_double *low_comp = bins[j].low_equal ? less_or_equal : less;
comp_double *high_comp = bins[j].high_equal ? less_or_equal : less;
if (low_comp(bins[j].low, value) && high_comp(value, bins[j].high)) {
// In range
}
一个简单的方法可以是:
bool higher = (value > bins[j].low) || (bins[j].low_equal && value == bins[j].low);
bool lower = (value < bins[j].high) || (bins[j].high_equal && value == bins[j].high);
if (higher && lower)
{
// In range
}
在我看来,这对于三元运算符来说是一个很好的例子
if ((bins[j].low_equal ? bins[j].low <= value : bins[j].low < value) &&
(bins[j].high_equal ? value <= bins[j].high : value < bins[j].high)) {
...
}
我正在测试一个数字是否位于两个值之间。我让用户选择逻辑比较是否应在任一(或两者)限制上包含 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
,我检查它是否位于 bin 边缘内。
但是,为了使用所需的一对比较运算符,我最终得到了这个可怕的条件块:
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;
}
}
有更好的方法吗?我能以某种方式设置要使用的运算符,然后调用它们吗?
你可以在函数上使用指针
bool less(double lhs, double rhs) { return lhs < rhs; }
bool less_or_equal(double lhs, double rhs) { return lhs <= rhs; }
using comp_double = bool(double, double);
然后
comp_double *low_comp = bins[j].low_equal ? less_or_equal : less;
comp_double *high_comp = bins[j].high_equal ? less_or_equal : less;
if (low_comp(bins[j].low, value) && high_comp(value, bins[j].high)) {
// In range
}
一个简单的方法可以是:
bool higher = (value > bins[j].low) || (bins[j].low_equal && value == bins[j].low);
bool lower = (value < bins[j].high) || (bins[j].high_equal && value == bins[j].high);
if (higher && lower)
{
// In range
}
在我看来,这对于三元运算符来说是一个很好的例子
if ((bins[j].low_equal ? bins[j].low <= value : bins[j].low < value) &&
(bins[j].high_equal ? value <= bins[j].high : value < bins[j].high)) {
...
}