2017-02-20 5 views
2

가까운베이스 :받기 내가 클래스 계층이 클래스

struct B {}; 
struct D1 : B {}; 
struct D2 : B {}; 

공통 기본 클래스를 얻을 (<type_traits>에서 가능성) std:: 헬퍼 함수/클래스의 일종을 사용 가능 (즉 B)에 대한 두 가지 변수 :

D1 d1; 
D2 d2; 

나는 행운을 내기 위해 std::common_type_t<decltype(d1), decltype(d2)>을 사용해 보았습니다. 당신이 common_type을 구현하는 코드를 보면

+3

'struct D1 : B1, B2 {};'와'struct D2 : B1, B2 {};'라고하면 어떻게 될까요? – Quentin

+0

@Quentin 좋은 질문 :) 다중 상속에 대해 잊어 버렸습니다 – alexolut

+0

@ 상속 다중 상속의 경우 'B1','B2' 중 하나가 적합 할 수 있습니다. – alexolut

답변

2

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를 반환 할 수 없습니다.

당신이 원하는 것을 원한다면, 아마 당신이 지켜야 할 계층의 계층 구조를 위해 특별히 구축해야 할 것입니다.

+0

좋은 답변입니다. 내가 현재 템플릿에서 '공유'기본 유형을 수동으로 계속 전달해야하는 것 같습니다. –