定义于头文件
<type_traits>
|
||
template<class... B>
struct disjunction; |
(1) | (C++17 起) |
构建类型特性 B...
的逻辑析取,等效于在特性序列上进行逻辑或。
特化 std::disjunction<B1, ..., BN> 拥有公开且无歧义的基类,即
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::value 的模板参数 Bi 必须可用作基类,且定义了可转换到 bool 的成员 value
|
template<class... B>
inline constexpr bool disjunction_v = disjunction<B...>::value; |
(C++17 起) | |
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 :它单纯地继承自其 ::value 显式转换成 bool 后等于 true 的首个 B ,或在它们都转换成 true 时继承自最后的 B 。例如 std::disjunction<std::integral_constant<int, 2>, std::integral_constant<int, 4>>::value 为 2 。
#include <iostream> #include <type_traits> using result0 = std::disjunction<std::bool_constant<false>, std::bool_constant<false>, std::bool_constant<false>>; using result1 = std::disjunction<std::bool_constant<true>, std::bool_constant<false>, std::bool_constant<false>>; int main() { std::cout << std::boolalpha; std::cout << result0::value << '\n'; std::cout << result1::value << '\n'; }
输出:
false true
(C++17)
|
逻辑非元函数 (类模板) |
(C++17)
|
变参数的逻辑与元函数 (类模板) |