Оператор перегрузки && и || создать класс, который сохраняет динамическую логику - PullRequest
4 голосов
/ 15 июля 2011

У меня есть класс, созданный из перечисления, который можно протестировать в любой момент в будущем, возвращая bool независимо от того, прошел ли он, например:

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

Тогда у двери есть условие, что онаможно использовать для определения его состояния.

Однако я хочу перегрузить && и ||операторы для этого класса условий таковы, что они могут быть объединены в цепочку и работать ожидаемым образом с нормальной логической логикой.Например, сделать возможным следующее:

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

Теперь дверь будет открыта во вторник или четверг после восьми.

Я не был уверен в правильном способе описания проблемычто также затрудняло поиск решения, если оно уже существовало.Спасибо за любую помощь в решении проблемы!

[Edit] Я не думаю, что объяснил это достаточно хорошо, я не хочу, чтобы ConditionObject оценивался во время создания объекта, а вместо этогосохраните всю логику в конечном ConditionObject так, чтобы ее можно было лениво измерить.

Используя второй пример выше, если я создал объект cnd в понедельник и никогда не приведу условие двери в другое, он откроется во вторникпотому что условие, которое ему было дано, начало возвращаться к истине.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

«Шаблоны выражений» могут быть вам полезны. Этот кажется достаточно основательным, но есть и другие.Я не слишком знаком с предметом, но это должно быть хорошим поиском.

Основная идея состоит в том, что вы хотите дерево, с листьями, являющимися фактическим условием, и ветвями между ними, операторамикоторые определяют, как они взаимодействуют.Шаблон выражения - это дерево, и вы перегружаете операторы, чтобы построить дерево.

Затем, когда вы действительно хотите узнать, нужно ли открывать вашу дверь, вы идете по дереву, проверяя каждое условие по очереди, пока не получите свой ответ.Оценка короткого замыкания [как упоминал Тони] должна происходить естественно, поскольку в конечном итоге вы прибегаете к встроенным операторам.

2 голосов
/ 15 июля 2011

Если вы перегружаете && и ||операторы, они не могут работать как нормальный.Например:

для обычного оператора &&, если для левой стороны установлено значение false, правая сторона больше не будет оцениваться;но как только вы перегрузите оператор &&, этот оператор будет вызываться как. = (A, B), поэтому оба параметра A и B используются как параметры, оба они будут оценены.

...