是否有任何方法或宏来模拟语法"if(a <= b < c <= ...)"来替换"if(a<=b && b < c && c <= ...)"?

Is there any method or macro to simulate syntax "if(a <= b < c <= ...)" to replace "if(a<=b && b < c && c <= ...)"?

本文关键字:lt if 任何 替换 方法 语法 模拟 是否      更新时间:2023-10-16

我想找到一个a <= b && b < c可以重写为a <= b < c的方法或宏,因为a <= b < c似乎更直接,并且经常出现在用户需求定义中。此外,a <= b && b < c需要键入两次b

我搜索了运算符,但似乎(我认为)只能为自定义类添加操作,而不能更改原始操作。我也知道我可以重载bool operator >但不确定我可以添加一个返回较大操作的新操作int operator >。即使运算符重载也有效,a <= b < c只会返回 c,但不会返回语句 a <= b < c 的真假(类似于 MAX(c, MAX(b, a)) )。

有什么方法可以模拟a <= b < c <= ...吗?

评论已经指出这是一个坏主意,所以我不会重复。

宏在某种程度上是可能的。这些运算符都不能是宏名称。但是如果你允许BADIDEA(a<=b<c),你可以将其扩展为HelperClass()*a<=b<c。这个想法是Helperclass::operator*具有最高的优先级。这意味着我们将其解析为 HelperClass::operator*(HelperClass(), a) .

第一部分返回另一个HelperClassHelperClass也会重载operator<=所以我们接下来会得到HelperClass::operator<=(firstExpr, b).

通过这种方式,我们可以构建一个传递给HelperClass的参数列表 它甚至支持 BADIDEA(a<b<c<d) .最后,我们只是调用 HelperClass::operator bool 它返回当且仅当参数列表排序时返回true

或者,您不需要构建参数列表,但可以立即评估它们。 HelperClass()*4<3已经可以评估到false,然后才能看到<=7 HelperClass()*4<3<=7