惰性求值和 const 正确性问题

Posted

技术标签:

【中文标题】惰性求值和 const 正确性问题【英文标题】:Lazy evaluation and problems with const correctness 【发布时间】:2010-12-20 22:16:04 【问题描述】:

我制作了一个 openGL 相机类,它使用惰性求值通过 getter 函数提供最终投影或模型视图投影矩阵。用户在实例的整个生命周期中提供各种相机参数(FOV、位置等),但不是每次更改参数时都重新计算投影矩阵和/或 MVP 矩阵,而是设置“更改”标志(即旧的缓存矩阵现在无效)。每当用户随后请求更新后的最终矩阵时,都会重新计算它,缓存结果并返回一个 const 引用。

在我打电话给我之前一切都很好:

const QMatrix4x4& oE_GLCamera::getModelViewProjection() const;

来自 const oE_GLCamera 实例的函数...我在应用程序中的任何地方都使用 const 引用从 CAD 视口中提取相机数据而不更改相机,但是如果成员变量无效,我的 getter 函数会对成员变量执行惰性求值 - 因此会破坏 const -正确性。

是否有我不知道的语言功能或设计范例可以帮助解决这个问题?还是惰性求值从根本上与 const 正确性不兼容?我知道 const_cast,我自己从未使用过它,但阅读了一些关于它的内容,归结为:如果你使用它,那么你已经在某个地方出错了。还是会成为我的救星?

我们将不胜感激任何建议, 凸轮

【问题讨论】:

【参考方案1】:

是否有我不知道的语言功能或设计范例可以帮助解决这个问题?

也许,mutable

标记为mutable 的类的成员始终不是const,即使它是通过引用或指向所属类的指针(即const 引用或指向const 的指针)来访问的.

【讨论】:

是:缓存值不是对象状态的一部分,因此将其标记为可变是合理的。 是的,就是这样。但是,我不会单独创建一半的数据成员 mutable,而是将所有可变数据移动到自己的 struct 中,并拥有一个 mutable 实例。

以上是关于惰性求值和 const 正确性问题的主要内容,如果未能解决你的问题,请参考以下文章

Python中的惰性求值

当参数是列表时,惰性求值如何工作?

惰性求值——lodash源码解读

Netezza 不对 case 语句进行惰性求值?

Python惰性求值器

从属属性中的 MATLAB 惰性求值