http://www.cplusplus.com/reference/type_traits/common_type/
는, 목록에 입력되는 유형 사이에 선택하는 것으로 보인다. 이것은 참조 동작입니다.
template <class... Types> struct common_type;
template <class T> struct common_type<T> {
typedef T type;
};
template <class T, class U> struct common_type<T,U> {
typedef decltype(true?declval<T>():declval<U>()) type;
};
template <class T, class U, class... V> struct common_type<T,U,V...> {
typedef typename common_type<typename common_type<T,U>::type,V...>::type type;
};
따라서 하나의 유형 "T"만 입력하면 해당 유형의 typedef를 반환합니다. 입력 한 두 가지 유형의 경우, "마법"이 라인에서 일어나는 : (? X Y는 : Z)
true?declval<T>():declval<U>()
그것이 삼항 명령을 사용하여 이것이 수행 인 항상 진실 인수는 두 개의 가능한 결과 사이에서 선택하기 . 삼항 함수는 하나의 리턴 타입 만 가질 수 있기 때문에 C++의 일반적인 변환 규칙이 적용됩니다. 표준 변환 규칙이 적용되어이 명령어가 반환 유형을 하나만 갖도록합니다. 이것이 바로 여기 "속임수"입니다. 이 프로세스는 D1 및 D2를 D1과 D2에 꽂을 때 실패합니다. 3 진 명령어가 D1과 D2를 모두 무엇으로 변환할지 모르기 때문입니다. 따라서 common_type은 C++ 내부에 이미 존재하는 변환 논리에 의존하며 실제로 클래스 "B"를 찾을 수 없습니다.
실제로 B를 D1 또는 B와 D2 또는 B/D1/D2를 모두 동시에 체크 할 수 있습니다 (세 번 이상 풀기 위해 템플릿 재귀를 사용함). 이러한 common_type 호출은 각각 B가 일반적인 유형이지만 체크에 B를 포함하지 않으면 코드 구현이 B를 반환 할 수 없습니다.
당신이 원하는 것을 원한다면, 아마 당신이 지켜야 할 계층의 계층 구조를 위해 특별히 구축해야 할 것입니다.
'struct D1 : B1, B2 {};'와'struct D2 : B1, B2 {};'라고하면 어떻게 될까요? – Quentin
@Quentin 좋은 질문 :) 다중 상속에 대해 잊어 버렸습니다 – alexolut
@ 상속 다중 상속의 경우 'B1','B2' 중 하나가 적합 할 수 있습니다. – alexolut