是否有用于“缓存计算”/“缓存 getter”的通用模式或即用型 boost 类?

我的意思是这样的:

class Test{
public:
     Value getValue() const;
protected:
     Value calculateValue() const;//REALLY expensive operation.
     mutable bool valueIsDirty;
     mutable Value cachedValue;
}

Value Test::getValue() const{
     if (valueIsDirty){
         cachedValue = calculateValue();
         valueIsDirty = false;
     }
     return cachedValue;
}

我可以使用 std::pair<Value, bool> 并将 getValue/calculateValue 转换为宏,但是如果 值依赖于其他值 (存储在其他类中)并且这些值也可以被缓存,那么这并没有真正的帮助。

这种“模式”有现成的解决方案吗?目前我手动处理这些缓存值,但这并不“漂亮”。

限制:
C++03 标准。允许 boost 。

最佳答案

Proxy design pattern 可以帮助解决这个问题。

一个典型的实现将定义一个类 ValuePtr ,它的行为就像一个普通的 Value* ,即它有一个重载的 operator->operator* 。但是这些操作符不是直接访问底层的 Value 对象,而是包含决定加载或重新计算实际值的逻辑。这个额外的间接级别将封装代理逻辑。

如果您需要计算对其他对象的引用,也许 std::shared_ptr<Value> 可用作 ValuePtr 中的底层数据类型。

有关代码示例,请参见 this siteBoost.Flyweight 也可能有帮助。

关于c++ - 缓存的 getter/计算模式|具有依赖关系跟踪的 boost 类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17722289/

10-11 22:53
查看更多