Если вы не хотите пересчитывать ij||kl
, просто сохраните их в переменную того типа, который возвращает выражение. Это как раз одна из причин существования переменных.
Хорошо, вот единственный способ, которым я могу думать об этом, хотя это звучит не очень красиво. Что вы можете сделать, это когда оператор || вызывается функция, сохраняя операнды, а также результат, в переменные экземпляра (если оператор || является функцией-членом некоторого класса) или в статически размещенную переменную (если оператор || объявлен на ней одиноким).
В следующий раз оператор || вызван, проверьте, совпадают ли операнды с последним вызовом. Если это так, просто верните последний сохраненный вами результат. В противном случае вычислите новый результат.
Это должно сработать. Противная часть заключается в том, что требуется копирование операндов в другие переменные, что может быть дорогостоящим в зависимости от обстоятельств. Однако, если переменные являются неизменяемыми, вы можете просто сохранить указатели на операнды, что будет немного дешевле.
Если вы хотите пойти еще дальше, вы можете использовать map
или что-то еще для хранения операндов и результатов нескольких предыдущих вызовов. Таким образом, это будет работать, если вам нужно сделать это для нескольких различных вычислений.