멤버 함수를 가진 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;
}
물론 위의 코드를 컴파일되지 않습니다. 이러한 솔루션의
const_cast<A*>(this)->b
mutable B b;
아무도 완벽하지 : 여기 내가 아는 두 가지 해결 방법이 있습니다. 솔루션 1은 A
인스턴스가 const
일 때 UB를 포함합니다. 솔루션 2는 다른 클래스의 const
멤버 함수에서 실수로 코더가 실수로 b
을 수정하는 것을 방지 할 수 없도록 클래스 전체에 가변성을 노출합니다.
const_cast
은 "로컬"이지만 UB를 트리거 할 수 있습니다. mutable
은 메모리 안전하지만 너무 "전역"입니다.
제 3의 해결책이 있습니까? 아니면 제가 잘못 이해하고 있습니까?
'tiny_change (b)'대신'tiny_change (result)'를 개발하고 변경되지 않은'B'의 결과를 계산할 수 있습니까? – Zereges
"작은 변화"를 취하기 위해'compute'를 오버로드 할 수는 없으며'b' 값이 무엇이든간에 그것을 사용합니까? 'B'는 분명히 비트 단위가 아닌 클래스의 논리적 구조와 관련이 있습니다. 두 솔루션 모두이 경우 해킹입니다. – StoryTeller
@Zereges 그 함수는 내 경우에 동형이 아닙니다. – rolevax