超载运营商&&和||创建一个保存动态逻辑的类

时间:2011-07-15 01:22:57

标签: c++ operators operator-overloading

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

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

然后门有条件可以用来确定它的状态。

但我希望现在超载&&和||此条件类的运算符,以便它们可以链接在一起并以正常布尔逻辑的预期方式工作。例如,使以下可能:

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

现在门将在星期二或星期四之后开放。

我不确定描述问题的正确方法,如果已经存在,也难以搜索解决方案。感谢您对此问题的任何帮助!

[编辑] 我不认为我解释得很好,我不希望在创建对象时评估ConditionObject,而是将整个逻辑存储到最终的ConditionObject中,以便可以懒惰地进行评估。 / p>

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

2 个答案:

答案 0 :(得分:3)

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

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

然后,当你真的想知道你的门是否需要打开时,你走在树上,轮流检查每个条件,直到你得到你的答案。像Tony提到的短路评估应该是自然而然的,因为你最终会依赖于内置的运营商。

答案 1 :(得分:2)

如果你超载&&和||操作员,他们不能像平常一样工作。例如:

正常&&操作员,如果确定左侧为假,则不再评估右侧;但一旦你超负荷&&运算符,此运算符将被调用,如。=(A,B),因此A和B都用作参数,它们都将被评估。