오래 전에 참조 정적 캐스트를 검사하지만, 형은 내가 수를 가정 것이 아니다 : 내가 원하는내가 static_cast를 수행 할 때마다 내가 어설를 얻을 수 있도록 나는 다음과 같은 템플릿을 생성 한
/// perform a static_cast asserted by a dynamic_cast
template <class Type, class SourceType>
Type static_cast_checked(SourceType item)
{
Assert(!item || dynamic_cast<Type>(item));
return static_cast<Type>(item);
}
오늘
/// overload for reference
template <class Type, class SourceType>
Type &static_cast_checked(SourceType &item)
{
Assert(dynamic_cast<Type *>(&item));
return static_cast<Type>(item);
}
그러나, 컴파일러는 내가 다른 참조에 대한 참조를 캐스팅하고 때이 오버로드를 사용하지 않는 것 :뿐만 아니라 포인터 만 참조하지 만 일하는 것이 변형을 만들 수 있습니다. 나는 이유를 이해하기에 충분하거나 템플릿이 작동하는 변형을 만들 수있을 정도로 템플릿 해상도 규칙을 이해하지 못한다.
참고 :이 프로젝트에서는 예외가 해제되어 있으므로 dynamic_cast<Type *>
을 NULL로 확인하는 대신 bad_cast exception
을 붙잡을 수 없습니다.
당신은'SOURCETYPE의 *'에 대한 과부하를 추가하고 원래 은퇴 할 수 있습니까? 가치 유형을 전혀 지원해야합니까? (그리고 그 문제를 해결, 나는 지금 궁금해?) –
나는이 코드 라인에 대해 생각하고, 왜 그것이 필요한지 이해할 수 없다. 동적 형변환을 사용하여 정적 형변환을 검사 할 경우 객체 만 검사 할 수있는 것보다 정적 형 형변환은 동적 형변환이 가능합니다. 저것은'dynamic_cast'의 재 구현입니다. 다이나믹 캐스트와 정적 캐스트의 차이점은 동적 캐스트가 vtable과 정적 캐스트를 조사하지 않는다는 것입니다. – nutario
정적 캐스팅이지만 주장하는 유형입니다. 즉, 캐스팅하는 유형에 대한 가정이 잘못되었다고 디버그 시간을 알려줍니다. – Suma