Skip to content

Latest commit

 

History

History
47 lines (35 loc) · 1 KB

BranchPipe.md

File metadata and controls

47 lines (35 loc) · 1 KB

<CppML/Functional/BranchPipe.hpp>

BranchPipe

template <typename Predicate, typename IfPipe, typename ElsePipe>
struct BranchPipe {
  template <typename... Ts>
  using f = /* .... */;
};

BranchPipe<Predicate, IfPipe, ElsePipe>

BranchPipe<Predicate, IfPipe, ElsePipe> is a metafunction that passes to the parameter pack Ts... to either IfPipe or ElsePipe, depending on the evaluation of Predicate on Ts....

f:: Ts... -> Ts... >-> (Predicate(Ts...) ? IfPipe : ElsePipe)

Example

template <typename Object>
struct Baser : Object {};

template <typename Object>
struct Holder : {
  Object object;
};

using U = ml::f<
              BranchPipe<
                    ml::IsClass<>,
                    ml::F<Baser>,
                    ml::F<Holder>>,
              int,
              string;

static_assert(
          std::is_same_v<
                         U,
                         ml::ListT<
                              Holder<int>, Baser<string>>>);