2017-11-13 2 views
0

s1 아래 클래스 템플릿 전문화에서는 정수 템플릿 매개 변수를 사용할 때 s1의 인스턴스화 만 허용합니다.클래스 템플릿 SFINAE를 통해 상속

template <typename, typename = void> 
    struct s1; 

template <typename T> 
struct s1<T, std::enable_if_t<std::is_integral<T>::value>> { }; 

다음 클래스 템플릿 s2은 비슷합니다. 조건부로 사소한 기본 클래스에서 개인적으로 상속 받지만. s1s2 사이의 기능상의 차이점은 무엇입니까? s1

struct Base { }; 

template <typename T> 
struct s2 : private std::enable_if_t<std::is_integral<T>::value,Base> { }; 
+0

'T'가 정수가 아니라면's2'는 무엇으로부터 유래한다고 생각합니까? – AndyG

+0

s2를 Base에서 개인적으로 파생 시키면 모든 의도와 목적이 같다고 생각합니다. –

+0

@RichardHodges가 제안한대로 개인적으로 상속받을 s2를 업데이트했습니다. – user2023370

답변

2

당신은 코드의 분산 비트 더 많은 경우를 커버 새로운 전문 분야로 확장 할 수 있습니다. SFINAE가 시작되었지만 단 하나의 전문화 만 유효하다면 선택 될 것입니다.

이러한 특수화에서 테스트 된 표현식은 임의적입니다.

T이 부동 소수점이거나 복잡한 유형이거나 배열 인 경우 허용되는 s1 특수화를 만들 수 있습니다.

s2의 경우 템플릿 패턴 일치가 노출 된 T을 선호 할 수있는 대상을 추가로 맞춤 설정하는 데 사용할 수 있습니다. 부동 소수점 유형을 허용하는 s2 전문화를 작성하는 방법은 없지만 모든 포인터를 허용하는 특수화를 작성할 수는 있습니다.

+0

감사합니다. 내가 관심있는 부분은 쌍 사이의 기능 차이입니다. – user2023370

+0

@user는 템플릿이 아니기 때문에 아무 것도하지 않습니다. 글쎄, 내가 컴파일하는데 걸리는 시간을 측정 할 수있을 것 같아. 그들은 그것을 사용할 수있는 다른 코드와 관련하여 다르게 행동합니다. 이는 내가 대답하려고했던 것입니다. 그들은 또한 그것들을 사용할 수있는 다른 코드에 대해서도 똑같이 행동합니다. "있는 그대로"의 의미를 염두에두고 사용하는 제한 사항이있는 경우 명시 적으로 도움이됩니다. 내 말은, 그것들을 템플릿 템플릿 인수로 넘기는 것입니까? – Yakk

+0

공정한 포인트. 예, 템플릿 템플릿 인수가 중요합니다. 나는's1'만이 두 개의 템플릿 인자를 취할 수 있다고 생각한다. (함수의 명확한 차이). 예 :'s1 '. 답변 감사합니다. – user2023370

관련 문제