Namespaces
Variants

std::experimental:: disjunction

From cppreference.net
헤더 파일에 정의됨 <experimental/type_traits>
template < class ... B >
struct disjunction ;
(라이브러리 fundamentals TS v2)

타입 특성 B... 논리적 선언 을 구성하며, 특성 시퀀스에 논리적 OR 연산을 효과적으로 수행합니다.

특수화 std :: experimental :: disjunction < B1, ..., BN > 는 공개적이고 명확한 베이스를 가집니다.

  • 만약 sizeof... ( B ) == 0 이면, std:: false_type ; 그렇지 않으면
  • B1, ..., BN 중에서 bool ( Bi :: value ) == true 인 첫 번째 타입 Bi , 또는 그러한 타입이 없으면 BN .

기본 클래스의 멤버 이름 중 disjunction operator= 를 제외한 나머지는 숨겨지지 않으며 disjunction 에서 명확하게 사용 가능합니다.

디스정션(disjunction)은 단락 평가(short-circuiting)를 수행합니다: 만약 Bi 와 같은 템플릿 타입 인자 중 bool ( Bi :: value ) ! = false 를 만족하는 인자가 존재한다면, disjunction < B1, ..., BN > :: value 의 인스턴스화는 j > i Bj :: value 의 인스턴스화를 요구하지 않습니다.

목차

템플릿 매개변수

B... - 모든 템플릿 인수 Bi 에 대해 Bi :: value 가 인스턴스화되는 경우, 해당 인수는 기본 클래스로 사용 가능해야 하며 bool 로 변환 가능한 멤버 value 를 정의해야 함

헬퍼 변수 템플릿

template < class ... B >
constexpr bool disjunction_v = disjunction < B... > :: value ;
(라이브러리 fundamentals TS v2)

가능한 구현

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...>>  {};

참고 사항

disjunction 의 특수화는 반드시 std:: true_type 또는 std:: false_type 중 하나로부터 상속받는 것은 아닙니다: 단순히 bool 로 명시적으로 변환된 ::value 가 true인 첫 번째 B 로부터 상속받거나, 모두 false로 변환될 경우 마지막 B 로부터 상속받습니다. 예를 들어, disjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value 2 입니다.

예제

참고 항목

가변 논리 OR 메타함수
(클래스 템플릿)