関数を使用してタプル要素を反復処理する
C では、タプルの各要素の操作を伴うコードに遭遇することがよくあります。次のスニペットは、このプロセスをカスタマイズするシナリオを示しています:
<code class="cpp">template<typename... Ts> struct TupleOfVectors { std::tuple<std::vector<Ts>...> tuple; void do_something_to_each_vec() { // Question: I want to do this: // "for each (N)": do_something_to_vec<N>() // How? } template<size_t N> void do_something_to_vec() { auto &vec = std::get<N>(tuple); // do something to vec } };</code>
目的は、タプルの要素を反復処理し、それぞれに特定の関数を適用することです。このパターンは、可変長ベクトルを使用したデータ構造を処理するときによく発生します。
テンプレート メタプログラミングの採用
この機能を実現するには、テンプレート メタプログラミング、特に ' 「for_each」パターン。このアプローチは、タプル要素のインデックスとして機能するコンパイル時の整数シーケンスの生成に依存しています。
<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>
ファンクター パターンの適用
次に、関数テンプレートを紹介します。タプル要素を反復処理します:
<code class="cpp">#include <tuple> namespace detail { template<typename T, typename F, int... Is> void for_each(T& t, F f, seq<Is...>) { auto l = { (f(std::get<Is>(t)), 0)... }; } } 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>
ベクトルのタプルのカスタマイズ
最後に、この 'for_each_in_tuple' メカニズムを 'TupleOfVectors' 構造体に統合します。
<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()); } struct tuple_vector_functor { template<typename T> void operator()(T const &v) { // Perform custom action on the vector } }; };</code>
このソリューションは、タプルの各要素を操作するための効率的かつ柔軟な方法を提供し、C での複雑なデータ処理タスクのための強力なツールとなります。
以上がC でテンプレート メタプログラミングを使用してタプル要素を反復処理し、それぞれに特定の関数を適用するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。