std::experimental:: disjunction
|
ヘッダーで定義
<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...>> {}; |
タグ内の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
です。
例
|
このセクションは不完全です
理由: 例がありません |
関連項目
|
(C++17)
|
可変長論理ORメタ関数
(クラステンプレート) |