template <typename By, typename Pipe = ml::ToList>
struct GroupBy {
template <typename ...Ts>
using f = /* .... */;
};
GroupBy<By, Pipe>
is a metafunction that passes to Pipe
a parameter pack ml::ListT
<Us...>...
, where each list in it consists of Us...
, types which evaluate to the same type when mapped by By
. Formally speaking, GroupBy<By, Pipe>
forms equivalence classes of Ts...
under By
. Pipe
defaults to ml::ToList
.
f:: Ts... -> ml::ListT<Us...>... >-> Pipe
By can be any metafunction returning a single type.
f:: T -> U
using T0 = ml::f<
ml::GroupBy<ml::AlignOf<>>,
int, char, float, bool, double>;
static_assert(
std::is_same_v<
T,
ml::ListT<
ml::ListT<int, float>,
ml::ListT<char, bool>,
ml::ListT<double>>>);