缓存方法结果时如何处理constness?
How to deal with constness when the method result is cached?
我有一个 class,其方法 (getter) 执行一些相对昂贵的操作,所以我想缓存它的结果。调用方法不会改变对象的行为,但需要将其结果存储在this
中,所以不能是const.
问题是我现在有另一个常量方法,我需要调用我的 getter。这个问题有一些普遍接受的解决方案吗?我应该绕过 getter 中的常量检查以使其成为常量,(这不会导致优化编译器出现问题吗?)或者我必须将非常量传播到使用此 getter 的所有方法?
示例:
class MyClass
{
public:
Foo &expensiveGetter() /*const?*/
{
if (cachedValue == nullptr) {
cachedValue = computeTheValue();
}
return *cachedValue;
}
void myMethod() /* How to make this const? */
{
auto &foo = expensiveGetter();
// etc.
}
private:
Foo *cachedValue = nullptr;
}
我正在寻找类似 Rust 中的 RefCell
的东西。
这是 mutable
specifier 特别适合的情况之一。当 class 成员是 mutable
时,即使封闭的 class 是 const
.
也可以更改该成员
因此,如果 MyClass::cachedValue
是 mutable Foo*
而不是 Foo*
,您可以在 MyClass
中使用 const
成员函数来更改 cachedValue
然后所有调用代码都可以正常作用于 const MyClass
。
我有一个 class,其方法 (getter) 执行一些相对昂贵的操作,所以我想缓存它的结果。调用方法不会改变对象的行为,但需要将其结果存储在this
中,所以不能是const.
问题是我现在有另一个常量方法,我需要调用我的 getter。这个问题有一些普遍接受的解决方案吗?我应该绕过 getter 中的常量检查以使其成为常量,(这不会导致优化编译器出现问题吗?)或者我必须将非常量传播到使用此 getter 的所有方法?
示例:
class MyClass
{
public:
Foo &expensiveGetter() /*const?*/
{
if (cachedValue == nullptr) {
cachedValue = computeTheValue();
}
return *cachedValue;
}
void myMethod() /* How to make this const? */
{
auto &foo = expensiveGetter();
// etc.
}
private:
Foo *cachedValue = nullptr;
}
我正在寻找类似 Rust 中的 RefCell
的东西。
这是 mutable
specifier 特别适合的情况之一。当 class 成员是 mutable
时,即使封闭的 class 是 const
.
因此,如果 MyClass::cachedValue
是 mutable Foo*
而不是 Foo*
,您可以在 MyClass
中使用 const
成员函数来更改 cachedValue
然后所有调用代码都可以正常作用于 const MyClass
。