名稱空間
變體
操作

std::experimental::disjunction

來自 cppreference.com
< cpp‎ | 實驗性
定義於標頭檔案 <experimental/type_traits>
template< class... B >
struct disjunction;
(庫基礎 TS v2)

構成型別特性 B...邏輯析取,實質上是對特性序列執行邏輯或運算。

特化 std::experimental::disjunction<B1, ..., BN> 具有一個公共且明確的基類,其為

  • sizeof...(B) == 0,則為 std::false_type;否則
  • B1, ..., BN 中首個型別 Bi,其 bool(Bi::value) == true,或若無此型別則為 BN

基類的成員名稱,除了 disjunctionoperator= 之外,在 disjunction 中不會被隱藏且明確可用。

析取是短路的:如果存在一個模板型別引數 Bi,其 bool(Bi::value) != false,那麼例項化 disjunction<B1, ..., BN>::value 不需要例項化 j > iBj::value

目錄

[編輯] 模板引數

B... - 每個模板引數 Bi,其 Bi::value 被例項化時必須可用作基類並定義可轉換為 bool 的成員 value

[編輯] 輔助變數模板

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...>>  {};

[編輯] 注意

disjunction 的特化不一定繼承自 std::true_typestd::false_type:它僅僅繼承自第一個 B,其 ::value 顯式轉換為 bool 後為 true,或者在所有 B 都轉換為 false 時繼承自最後一個 B。例如,disjunction<std::integral_constant<int, 2>, std::integral_constant<int, 4>>::value2

[編輯] 示例

[編輯] 另見

可變引數邏輯 OR 元函式
(類模板) [編輯]