Namespaces
Variants

std::experimental:: disjunction

From cppreference.net
定义于头文件 <experimental/type_traits>
template < class ... B >
struct disjunction ;
(库基础 TS v2)

形成类型特征 B... 逻辑析取 ,实质上对特征序列执行逻辑或运算。

特化 std :: experimental :: disjunction < B1, ..., BN > 具有一个公开且明确的基类,该基类是

  • sizeof... ( B ) == 0 ,则为 std:: false_type ;否则
  • 返回 B1, ..., BN 中首个满足 bool ( Bi :: value ) == true 的类型 Bi ,若不存在此类类型则返回 BN

基类成员名称(除 disjunction operator= 外)不会被隐藏,且在 disjunction 中可无歧义地访问。

析取操作具有短路特性:如果存在模板类型参数 Bi 满足 bool ( Bi :: value ) ! = false ,则实例化 disjunction < B1, ..., BN > :: value 时不需要对 j > i Bj :: value 进行实例化。

目录

模板参数

B... - 每个被实例化的模板参数 Bi ,其 Bi :: value 必须可用作基类,并且定义的成员 value 必须可转换为 bool

辅助变量模板

template < class ... B >
constexpr bool disjunction_v = disjunction < B... > :: value ;
(库基础技术规范 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 ,或在所有 B 均转换为 false 时继承自最后一个 B 。例如, disjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value 的值为 2

示例

参见

变参逻辑 OR 元函数
(类模板)