Namespaces
Variants

std::experimental:: conjunction

From cppreference.net
Определено в заголовочном файле <experimental/type_traits>
template < class ... B >
struct conjunction ;
(library fundamentals TS v2)

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

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

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

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

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

Содержание

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

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

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

template < class ... B >
constexpr bool conjunction_v = conjunction < B... > :: value ;
(техническая спецификация библиотеки fundamentals v2)

Возможная реализация

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

Примечания

Специализация conjunction не обязательно наследует ни от std:: true_type , ни от std:: false_type : она просто наследует от первого B, чье ::value, преобразованное в bool, равно false, или от самого последнего B, когда все они преобразуются в true. Например, conjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value равно 4 .

Пример

#include <experimental/type_traits>
#include <iostream>
// func is enabled if all Ts... have the same type
template<typename T, typename... Ts>
constexpr std::enable_if_t<std::experimental::conjunction_v<std::is_same<T, Ts>...>>
func(T, Ts...)
{
    std::cout << "All types are the same.\n";
}
template<typename T, typename... Ts>
constexpr std::enable_if_t<!std::experimental::conjunction_v<std::is_same<T, Ts>...>>
func(T, Ts...)
{
    std::cout << "Types differ.\n";
}
int main()
{
    func(1, 2'7, 3'1);    
    func(1, 2.7, '3');    
}

Вывод:

All types are the same.
Types differ.

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

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