boost::any
에는 any*
피연산자에 대해 원하는 기능을 수행하는 문서화되지 않은 ValueType * unsafe_any_cast(any * operand)
함수가 포함되어 있습니다.
원하는 것을 얻기 위해 참조 주소를 취하거나 부스트가 오픈 소스이기 때문에 any&
피연산자를 취하기 위해이 함수 템플릿 세트를 패치 할 수 있습니다.
그런 다음 디버그 빌드의 안전 버전과 릴리스 빌드의 안전하지 않은 버전을 사용하는 래퍼를 만듭니다. 그러나 적어도 한 가지 더 추가 할 것입니다 - 디버그 래퍼는 잘못된 캐스트에 대해 throw 된 예외를 catch하고 디버거를 호출하거나 프로그램을 크래시하여 디버그 모드에서 실행하면 해당 잘못된 캐스트가 다음과 같은 방식으로 처리되지 않도록해야합니다. 릴리스 빌드가 정의되지 않은 동작을한다는 사실을 숨 깁니다. 또한 예비에게 안전하지 않은 버전을 제거 할 수있는 권리 향상을 염두에
유지 : 그래서 당신은 (을 확장하거나 any.hpp
패치)이 기능을 사용하기로 결정한 경우
// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time.
을, 당신은 어떤 수준으로 사는거야 귀하의 코드가 전달 될 수있는 사람에 따라 수용 가능할 수도 있고 그렇지 않을 수도있는 유지 보수 의무가 있습니다.
'boost :: any'에서 타입 체크를 비활성화하면'void *'를 사용하는 것과 어떻게 다른가요? – FatalError
@FatalError :'boost :: any'는 객체를 소유하고 있고,'void *'는 그 객체를 소유하지 않습니다. 즉, 나는 성능에 신경 쓰면 아마도 boost :: any를 사용해서는 안된다는 감정에 동의한다. – ildjarn
@ildjarn : 사실,하지만 그는 유형 안전면에서 의미가 있다고 생각합니다. 'boost :: any'의 요점은 누군가를 틀린 타입으로 캐스팅하지 못하게하는 것입니다. 그러나 질문자는 그렇게하지 않는 방법을 정확히 묻는 것처럼 보입니다. 'boost :: any'를 사용하지 마십시오! – GManNickG