自我解释。
基本上说我有这样的类型列表:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
它们可以是各种类型的类型列表。
如何获得笛卡尔积的类型列表?
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
我确实涉足如何创建如下所示的双向笛卡尔乘积:如何创建类型列表的笛卡尔乘积?,但n方法似乎并不那么琐碎。
现在我正在尝试...
template <typename...> struct type_list{};
// To concatenate
template <typename... Ts, typename... Us>
constexpr auto operator|(type_list<Ts...>, type_list<Us...>) {
return type_list{Ts{}..., Us{}...};
}
template <typename T, typename... Ts, typename... Us>
constexpr auto cross_product_two(type_list<T, Ts...>, type_list<Us...>) {
return (type_list<type_list<T,Us>...>{} | ... | type_list<type_list<Ts, Us>...>{});
}
template <typename T, typename U, typename... Ts>
constexpr auto cross_product_impl() {
if constexpr(sizeof...(Ts) >0) {
return cross_product_impl<decltype(cross_product_two(T{}, U{})), Ts...>();
} else {
return cross_product_two(T{}, U{});
}
}
我要说的是,考虑到正确实现的难度,请像Barry的回答那样使用boost。不幸的是,我必须坚持使用手动方法,因为是否使用增强是来自其他地方的决定:(
8
OOF,你惩罚😏贪食
—
亮度种族在轨道
我有点不满意,但是您可以通过以下方式修改2维笛卡尔积:1)第一个类型列表实际上是一种类型的类型列表的类型列表;2)不是将类型列表中的两个类型串联在一起,元函数会将第二个列表中的类型附加到第一个类型列表的“子”列表中(以笛卡尔乘积的方式)?如果可行,则可以使用递归算法轻松解决该问题。
—
smitsyn
递归实现的真正困难在于,它
—
Max Langhof
cartesian_product
是类型列表的列表,并且在每个递归步骤中,您都希望将内容附加到每个内部类型列表中。进入包装的第二个包装级别需要一些扣除...
我猜您也可以通过将其视为要遍历每个“类型网格点”的N维“类型空间”来“线性地”实现它。计算网格点的数量,然后像遍历展平的ND数组一样遍历网格点,并计算每个网格点的类型。需要考虑的事情……
—
Max Langhof