メンバ関数f
を持つクラスA
があるとします。 f
は、A
の何も変更せずに単純に値を計算します。しかし、実装では、それは一時的A
を変更しない:constメンバ関数のフィールドを一時的に変更する
class A
{
int f() const
{
tiny_change(b); // since copying "b" is expensive
int result = compute(b);
tiny_recover(b); // "b" backs to the original value
return result;
}
B b;
}
もちろん上記のコードはコンパイルされません。ここで私が知っている2つの回避策は次のとおりです。これらのソリューションの
const_cast<A*>(this)->b
mutable B b;
どれも完璧ではありません。解決策1は、A
のインスタンスがそれ自身const
であるときにUBを伴う。他のconst
のメンバー関数でコーダーが誤ってb
を変更するのを防ぐことができないように、ソリューション2はクラス全体に変更可能性を公開します。
const_cast
は "ローカル"ですが、UBをトリガーする可能性があります。 mutable
はメモリーに安全ですが、グローバルでもあります。
3番目の解決策がありますか、何か間違って理解していますか?
'tiny_change(b)'の代わりに 'tiny_change(result)'を並べて、変更されていない 'B'の結果を計算できませんか? – Zereges
"小さな変更"を取るために 'compute'をオーバーロードすることはできませんし、' b'の値の代わりにその値を使用できますか? 'B'は明らかにビット単位の論理的なものではなく、クラスの論理的な性質に関係しています。両方のソリューションはこの場合ハックです。 – StoryTeller
@Zeregesこれらの関数は私のケースでは準同型ではありません – rolevax