Namespaces
Variants

std::experimental:: disjunction

From cppreference.net
Определено в заголовочном файле <experimental/type_traits>
template < class ... B >
struct disjunction ;
(техническая спецификация библиотеки fundamentals v2)

Формирует логическую дизъюнкцию из признаков типов B... , фактически выполняя логическое ИЛИ над последовательностью признаков.

Специализация std :: experimental :: disjunction < B1, ..., BN > имеет открытый и однозначный базовый класс, который является

  • если sizeof... ( B ) == 0 , std:: false_type ; иначе
  • первый тип Bi в B1, ..., BN для которого bool ( Bi :: value ) == true , или BN если такого типа нет.

Имена членов базового класса, за исключением disjunction и operator= , не скрыты и однозначно доступны в disjunction .

Дизъюнкция использует сокращённое вычисление: если существует аргумент шаблона типа Bi с bool ( Bi :: value ) ! = false , то инстанцирование disjunction < B1, ..., BN > :: value не требует инстанцирования Bj :: value для j > i .

Содержание

Параметры шаблона

B... - каждый шаблонный аргумент Bi для которого Bi :: value должен быть пригоден для использования в качестве базового класса и определять член value который конвертируется в bool

Шаблон вспомогательной переменной

template < class ... B >
constexpr bool disjunction_v = disjunction < B... > :: value ;
(техническая спецификация библиотеки fundamentals 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 : она просто наследует от первого B , чье ::value , явно преобразованное в bool , равно true, или от самого последнего B, когда все они преобразуются в false. Например, disjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value равно 2 .

Пример

Смотрите также

вариативная логическая OR метафункция
(шаблон класса)