テンプレート タプル: 各要素で関数を呼び出す
目的は、テンプレート タプル std:: の各要素で関数を呼び出すことです。タプル<:vector>...>。 TupleOfVectors 構造体内で、do_something_to_each_vec メソッドを実装しようとします。このメソッドは、各メンバー ベクトルを反復処理し、それらに対して特定の関数を実行します。
ソリューション
いくつかのメタを使用するプログラミング技術を使えば、この課題にエレガントに対処できます。コンパイル時シーケンスとコンパニオン関数テンプレートを生成するメタ関数 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>
<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...>& t, F f) { detail::for_each(t, f, detail::gen_seq<sizeof...(Ts)>()); }</code>
次に示すように、for_each_in_tuple を活用できます。
<code class="cpp">#include <string> #include <iostream> struct my_functor { template<typename T> void operator () (T& t) { std::cout << t << std::endl; } }; int main() { std::tuple<int, double, std::string> t(42, 3.14, "Hello World!"); for_each_in_tuple(t, my_functor()); }</code>
あなたの場合、次のように利用できます:
<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 operations on the vector argument... } }; };</code>
以上がメタプログラミングを使用してベクトルのタプル内の各要素に関数を適用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。