我在标准库(std::disjunction
)中看到了source的实现:
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<B1>
专门化为B1
的必要性。为什么它比我天真的实施更好?
template<class...> struct or_t
: std::false_type {};
template<class B1, class... Bn> struct or_t<B1, Bn...>
: std::integral_constant<bool, bool(B1::value) || bool(or_t<Bn...>::value)> {};
答案 0 :(得分:6)
您返回std::integral_constant
。
std::disjunction
返回给定类型之一(可能有其他成员)。
答案 1 :(得分:3)
此外,disjunction<B1,...,BN>
是必需的,如果所有类型都是假的,则会导致最后一个类型(BN
)。(请参阅[meta.logical#10.2])。
一元特化disjunction<B1>
在递归序列的尾部实现了这种行为。
例如,如果没有一元专业化,disjunction<B1>
如果B1
为B1::value
则会true
,否则会std::false_type
。
事实上,我从未使用过这个特性系列,但它看起来非常灵活:由于所有B可能具有不同的类型,因此std :: disjunction返回其:: value成员转换为true的第一个类型。这有点奇怪吗?制作一个有趣的选择器
可能很有用
template<class T>
struct some_condition: std::bool_constant</*whatever*/>
{
using payload = T;
};
// take the first T satisfying some_condition, or last T if none does
disjunction<some_condition<T>...>::payload
// take the first T satisfying some_condition, or none
disjunction<some_condition<T>...,none_type>::payload
唯一让我讨厌 disjunction 的是它的名字......