2012-05-16 7 views
2

boost::any_cast<T>(any&)에 대한 호출이 값 비싼 typechecking을 호출하여 캐스트가 유효한지 확인하는 것처럼 보입니다. 구체적으로는 호출 캐스트가 법적 있는지 확인하려면 다음 테스트를 수행합니다. (operand->) (입력 이름(), 유형 ID (치형) .name을())boost :: any_cast <double> (모든 &)이 빨라질 수 있습니까?

표준 : : strcmp와 == 0

캐스트가 합법적이면 코드에서 static_cast를 수행합니다.

이것은 디버그 모드에 유용하지만 프로덕션 코드에서는 다소 느립니다. strcmp를 건너 뛸 수있는 방법이 있습니까?

+0

'boost :: any'에서 타입 체크를 비활성화하면'void *'를 사용하는 것과 어떻게 다른가요? – FatalError

+0

@FatalError :'boost :: any'는 객체를 소유하고 있고,'void *'는 그 객체를 소유하지 않습니다. 즉, 나는 성능에 신경 쓰면 아마도 boost :: any를 사용해서는 안된다는 감정에 동의한다. – ildjarn

+5

@ildjarn : 사실,하지만 그는 유형 안전면에서 의미가 있다고 생각합니다. 'boost :: any'의 요점은 누군가를 틀린 타입으로 캐스팅하지 못하게하는 것입니다. 그러나 질문자는 그렇게하지 않는 방법을 정확히 묻는 것처럼 보입니다. 'boost :: any'를 사용하지 마십시오! – GManNickG

답변

5

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. 

을, 당신은 어떤 수준으로 사는거야 귀하의 코드가 전달 될 수있는 사람에 따라 수용 가능할 수도 있고 그렇지 않을 수도있는 유지 보수 의무가 있습니다.