自明です。
基本的に、次のようなタイプのリストがあるとします。
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{});
}
}
正しく理解するのがどれほど難しいかを考えると、バリーの答えのようにブーストを使用するだけです。残念ながら、ブーストを使用するかどうかは別の場所からの決定であるため、手作業でのアプローチに悩まされなければなりません:(
8
OOF、あなたが😏罰のために大食家だ
—
軌道上での明度レース
私はそれでちょっとおしゃべりですが、次のような方法で2方向デカルト積を変更できますか?1)最初のタイプリストは、実際には1タイプのタイプリストのタイプリストです。2)タイプリストの2つのタイプを連結する代わりに、メタ関数は2番目のリストのタイプを最初のタイプリストの「子」リストに追加します(デカルト積の方法)?可能であれば、再帰的アルゴリズムで問題を簡単に解決できます。
—
smitsyn
再帰的な実装の実際の難しさは
—
Max Langhof
cartesian_product
、型リストのリストであり、再帰の各ステップで、各内部型リストに要素を追加したいということです。パックの2番目のパッキングレベルに入るには、いくつかの控除が必要です...
これを、各「タイプグリッドポイント」をトラバースするN次元の「タイプスペース」と見なすことで、「線形」に実装することもできると思います。グリッド点の数を計算してから、平坦化されたND配列を通過するようにトラバースし、各グリッド点でタイプを計算します。考慮すべきこと...
—
Max Langhof
@MaxLanghof「C ++ 17のタプルのデカルト積」に沿った何か?
—
Deduplicator