重载运算符&& 和 ||创建保存动态逻辑的类

Overloading operator&& and || to create a class that saves dynamic logic

本文关键字:动态 创建 运算符 重载 保存      更新时间:2023-10-16

我有一个从enum创建的类,可以在将来的任何时候测试它是否通过,返回一个bool值,例如:

ConditionObject cnd(CondIsTuesday);
door.setOpenCondition(cnd);

那么门就有了一个条件,可以用来确定它的状态。

但是我现在希望重载&&并且这个条件类的运算符可以被链接在一起,并以正常布尔逻辑所期望的方式工作。例如,实现以下内容:

ConditionObject cnd(ConditionObject(CondIsTuesday) || (ConditionObject(CondIsThursday) && ConditionObject(CondIsAfterEight)));
door.openCondition(cnd);

现在门将在星期二或星期四八点后开。

我不确定描述这个问题的正确方法,这也使得如果已经存在解决方案,寻找解决方案变得困难。谢谢你对这个问题的任何帮助!

[编辑]我认为我解释得不够好,我不希望在创建对象时对ConditionObject求值,而是希望将整个逻辑存储到最终的ConditionObject中,以便可以惰性地求值。

使用上面的第二个例子,如果我在星期一创建了nd对象,并且没有给门另一个条件,它将在星期二打开,因为它所给的条件开始返回true。

"表达式模板"可能对您有用。这似乎是一个相当彻底的主题,但还有其他的。我对这个主题不太熟悉,但这应该是一个很好的谷歌点。

基本思想是你想要一个树,叶子是一个实际的条件,它们之间的分支是定义它们如何相互作用的操作符。表达式模板就是这个树,您可以重载操作符来构建这个树。

然后,当你真的想知道你的门是否需要打开时,你沿着树走,依次检查每个条件,直到你得到答案。短路计算[就像Tony提到的]应该是自然而然的,因为你最终会依赖于内置的操作符。

如果你重载&&还有操作员,他们不能像普通操作员那样工作。例如:

为正常&&运算符,如果左边被确定为false,右边不再被求值;但是一旦你超载了操作符,该操作符将像。=(A, B)一样被调用,因此A和B都被用作参数,它们都将被求值。