std::disjunction
STD::断开
Defined in header | | |
---|---|---|
template<class... B> struct disjunction; | (1) | (since C++17) |
形成逻辑分离类型性状B...
有效地执行一个逻辑或一系列的特征。
专业化std::disjunction<B1, ..., BN>有一个公共的和明确的基础,也就是说。
- 如果
sizeof...(B) == 0
,,,std::false_type
;否则
- 第一类
Bi
在B1, ..., BN
对此bool(Bi::value) == true
,或BN
如果没有这样的类型。
基类的成员名称,但disjunction
和operator=
,则不隐藏,并且可以在disjunction
...
断开是短路的:如果有模板类型参数。Bi带着bool(Bi::value) != false,然后实例化disjunction<B1, ..., BN>::value不需要实例化Bj::value为j > i...
模板参数
B... | - | every template argument Bi for which Bi::value is instantiated must be usable as a base class and define member value that is convertible to bool |
---|
辅助变量模板
template | | (since C++17) |
---|
可能的实施
模板<class...>结构分离:std::false[医]类型{};模板<class B1>结构分离<B1>:B1{};模板<类B1,类...。结构分离<B1,Bn...>:std::条件[医]t<bool%28B1::值%29,B1,分离<Bn.>>{};
*。
注记
...的专业化disjunction不一定是从任何一方继承的std::true_type或std::false_type*它只是继承了第一个B谁的::value,显式转换为bool,是真的,或者从最后的B,当它们全部转换为假。例如,std::disjunction<std::integral_constant<int, 2>,std::integral_constant<int, 4>>::value是2...
短路实例化disjunction从折叠表达式:折叠表达式,如(... || Bs::value)实例化每个B在Bs,同时std::disjunction_v<Bs...>一旦确定了值,就停止实例化。如果后面的类型实例化成本很高,或者使用错误的类型实例化会导致硬错误,则这尤其有用。
例
二次
#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
二次
另见
negation (C++17) | logical NOT metafunction (class template) |
---|---|
conjunction (C++17) | variadic logical AND metafunction (class template) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。