2017-11-15 3 views
1

에서 분리 나는 표준 라이브러리 (source)에 std::disjunction의 구현을 본 적이 :구현 : 표준 라이브러리

template<class...> struct disjunction : std::false_type { }; 
template<class B1> struct disjunction<B1> : B1 { }; 
template<class B1, class... Bn> 
struct disjunction<B1, Bn...> 
    : std::conditional_t<bool(B1::value), B1, disjunction<Bn...>> { }; 

내가 B1disjunction<B1>을 전문으로 할 필요가 궁금합니다. 왜 내 순진한 구현보다 나은가요?

template<class...>    struct or_t 
    : std::false_type {}; 
template<class B1, class... Bn> struct or_t<B1, Bn...> 
    : std::integral_constant<bool, bool(B1::value) || bool(or_t<Bn...>::value)> {}; 
+3

'std :: disjunction' 단락. – Zereges

+0

@Zereges 이것은 대답 일 수 있습니다;) – YSC

+0

이것은 확실히 표준 라이브러리 구현이 아닙니다 ... –

답변

3

또한 disjunction<B1,...,BN>이 필요합니다. 모두가 위조되면 마지막 유형 (BN)이됩니다 ([meta.logical#10.2] 참조).

단항 전문화 은 재귀 시퀀스의 끝 부분에서이 동작을 구현합니다.

예를 들어, 단항 전문화없이, disjunction<B1>B1::valuetruestd::false_type 그렇지 않으면이다 B1 경우 줄 것입니다. 모든 기지국이 다른 유형을 가질 수 있기 때문에


는 표준 : 분리 누구의 :: 값 멤버 true로 변환하는 첫 번째 유형을 반환합니다. 조금 이상하지 않니? 참

, 나는 특성 (아직)의 가족을 사용한 적이 재미있는 선택을하기 위해 유용 할 수 있습니다,하지만 매우 유연한 추상화 보인다

template<class T> 
struct some_condition: std::bool_constant</*whatever*/> 
{ 
    using payload = T; 
}; 

// take the first T satisfying some_condition, or last T if none does 
disjunction<some_condition<T>...>::payload 

// take the first T satisfying some_condition, or none 
disjunction<some_condition<T>...,none_type>::payload 

을 싫어 유일한 약 분리형은 그 이름입니다 ...

6

std::integral_constant을 반환합니다.

std::disjunction은 지정된 유형 (추가 구성원이있을 수 있음) 중 하나를 반환합니다.

+0

모든 B 타입이 서로 다를 수 있으므로'std :: disjunction '는': : value' 멤버가'true'로 변환됩니다. 조금 이상하지 않니? 재미있는 선택자/(a) buse sfinae를 만드는 것이 유용 할 수 있습니다 ... – YSC