関数テンプレートを使用したタプル要素の操作
さまざまなベクトル型を含むタプルがあり、特定の操作を実行したいシナリオを想像してください。それぞれのベクトルについて。たとえば、タプル内の各ベクトルに対して、N ごとに「do_something_to_vec
1.コンパイル時インデックス シーケンスの生成:
まず、タプル内のベクトルの位置に対応するインデックス シーケンスを生成する方法が必要です。これは、seq および gen_seq メタ関数を使用して実行できます:
<code class="cpp">namespace detail { template<int... Is> struct seq { }; template<int N, int... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { }; template<int... Is> struct gen_seq<0, Is...> : seq<Is...> { }; }</code>
2。関数を適用するカスタム ファンクターの定義:
次に、目的の関数を各ベクトルに適用できるファンクターを作成します。ファンクターは次のようになります。
<code class="cpp">struct tuple_vector_functor { template<typename T> void operator () (T const &v) { // Do something on the argument vector... } };</code>
3. for_each_in_tuple 関数の利用:
ここで、seq および gen_seq メタ関数を使用してタプルの各要素を反復処理し、カスタム ファンクターを適用する汎用の for_each_in_tuple 関数を定義できます:
<code class="cpp">#include <tuple> template<typename... Ts, typename F> void for_each_in_tuple(std::tuple<Ts...> const& t, F f) { detail::for_each(t, f, detail::gen_seq<sizeof...(Ts)>()); }</code>
4.ベクトルのタプルへの関数の適用:
TupleOfVectors 構造体内で、for_each_in_tuple 関数を利用して、タプル内の各ベクトルに対して特定の関数を呼び出すことができます:
<code class="cpp">template<typename... Ts> struct TupleOfVectors { std::tuple<std::vector<Ts>...> t; void do_something_to_each_vec() { for_each_in_tuple(t, tuple_vector_functor()); } };</code>
5.ライブ例:
ソリューションの使用方法を示すライブ例: https://godbolt.org/z/q4wXTqPa6
注:
C 14 以降を使用している場合は、seq および gen_seq メタ関数を std::integer_sequence に置き換えることができます。 C 17 以降では、std::apply を使用したさらに単純なソリューションが可能です。
<code class="cpp">std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);</code>
以上がC テンプレートのメタプログラミングを使用して、ベクトルのタプル内の各ベクトルに特定の関数を適用するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。