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 の場合、 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 メンバーを定義し、かつ bool に変換可能でなければならない

ヘルパー変数テンプレート

template < class ... B >
constexpr bool disjunction_v = disjunction < B... > :: value ;
(ライブラリファンダメンタル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...>>  {};
(注:指定された条件により、HTMLタグ・属性、 タグ内のC++コード、C++専門用語はすべて原文のまま保持されています)

注記

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メタ関数
(クラステンプレート)