class No { };
는 - 다른 클래스가 정의하는, 적어도 3 배 큰 것 Yes
- (표준에서 요구) 제로
class Yes { No no[3]; };
을하지 않습니다 정의되지 않은 크기를해야하는 클래스를 정의한다 a No
. 그래서 그들은 서로 다른 크기가 보장됩니다.
static Yes Test(B*);
- Yes
을 반환하는 함수를 선언하지만 정의는 제공하지 않습니다 (필요하지 않습니다). B
에서 파생 된 객체를 가리키는 포인터 인수와 일치합니다.
static No Test(...);
- No
(작음, 기억 하시겠습니까?)을 반환하는 함수를 선언하십시오. 좀 더 구체적인 것을 만족시키지 못하면 과부하가 선택됩니다. 인수를 수락합니다 (그러나 인수가 B
에서 파생 된 경우 다른 버전은 기본 설정에서 과부하 해결로 선택됩니다).
sizeof(Test(static_cast<D*>(0)))
은 D
에 대한 포인터를 전달할 때 Test
에 의해 반환 된 개체의 크기를 추론합니다. D
이 B
에서 파생 된 경우 Yes
이고 그렇지 않은 경우 No
이됩니다.
'통화'는 추론되지 않은 컨텍스트에서 이루어 지므로 평가 (호출)되지 않고 선택 만되고 반환 유형이 추론됩니다.
나머지는 아마도 자명 할 것입니다.
이이 한마디에 일을 무엇
enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };
은 말하고있다 :
가 "라는 상수를 선언
는
그래서이 모두 함께 여기에 넣어됩니다 :)되지 않았습니다 밝혀 Is
이고, D*
으로 Test를 호출 한 결과가 Yes
과 같은 크기 일 경우 true
이되며, 결과가 호출되는 유형이 ad 인 경우에는 false
이됩니다 ifferent 크기. 위의 두 가지 오버로드로 인해 D가 B 또는 그 외의 파생물 인 경우 Test(D*)
은 Yes
과 동일한 크기 인 Yes
을 반환하는 Yes
버전을 선택합니다. 이 과부하가 선택되지 않으면 더 관대하지만 (우선 순위는 낮습니다) 하나가됩니다. 그 사람은 No
을 반환하는데, 분명히 Yes
(정의)과 같은 크기는 아닙니다..? "
왜 (오버로드 확인 기준)
Test(B*)
보다
Test(...)
'낮은 우선 순위는'그냥이기 때문에 표준이되고 그것을 정의입니다 마지막으로
:.
template <class C, class P>
bool IsDerivedFrom() {
return IsDerivedFromHelper<C, P>::Is;
}
이가를 생성 함수는 C
및 P
의 두 클래스 유형에 대해 위 테스트의 결과를 반환합니다. P
이 C
에서 파생되면 true를 반환하고 그렇지 않으면 false를 반환합니다.
'static T f (U);''T' 형의 정적 함수'f'를 선언하고'U 형 '의 1 매개 변수를 선언합니다. –