在标准库中实现std :: disjunction

时间:2017-11-15 14:54:47

标签: c++ c++17 standard-library

我在标准库(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)> {};

2 个答案:

答案 0 :(得分:6)

您返回std::integral_constant

std::disjunction返回给定类型之一(可能有其他成员)。

答案 1 :(得分:3)

此外,disjunction<B1,...,BN>是必需的,如果所有类型都是假的,则会导致最后一个类型(BN)。(请参阅[meta.logical#10.2])。

一元特化disjunction<B1>在递归序列的尾部实现了这种行为。

例如,如果没有一元专业化,disjunction<B1>如果B1B1::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 的是它的名字......