자기 설명.
기본적으로 다음과 같이 유형 목록이 있다고 가정하십시오.
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의 대답 에서처럼 부스트를 사용하십시오. 불행히도 부스트를 사용하거나 사용하지 않는 것이 다른 곳에서 오는 결정이기 때문에 수동 롤 접근 방식을 고수해야합니다.
8
Oof, 당신은 처벌을위한 열성입니다 😏
—
Orbit in
나는 그것에 약간 짜증나지만, 당신은 다음과 같은 방식으로 2-way 직교 곱을 수정할 수 있습니다 : 1) 첫 번째 typelist는 실제로 1 type의 typelist입니다. 2) 유형 목록에서 두 유형을 연결하는 대신, 메타 기능은 두 번째 목록에서 유형을 첫 번째 유형 목록의 "자식"목록에 추가합니다 (카르테 시안-제품 방식)? 가능하다면 재귀 알고리즘으로 문제를 쉽게 해결할 수 있습니다.
—
smitsyn
재귀 구현의 실제 어려움
—
들어가려면
cartesian_product
은 유형 목록 목록이며 각 재귀 단계에서 각 내부 유형 목록에 항목을 추가하려고한다는 것입니다. 포장의 두 번째 포장 수준에
이것을 각 "유형 그리드 포인트"를 가로 지르고 자하는 N 차원 "유형 공간"으로 보아서 "선형으로"구현할 수있을 것 같습니다. 그리드 포인트의 수를 계산 한 다음 평평한 ND 배열을 통해처럼 그리드 포인트를 가로 질러 각 그리드 포인트에서 유형을 계산합니다. 고려할 사항 ...
—
Max Langhof
@MaxLanghof " C ++ 17에서 튜플의 데카르트 곱 "라인을 따라 뭔가 ?
—
중복 제거기