Menggunakan Templat Fungsi untuk Memanipulasi Elemen Tuple
Bayangkan senario di mana anda mempunyai tuple yang mengandungi jenis vektor yang berbeza dan keinginan untuk melaksanakan operasi tertentu pada setiap vektor. Sebagai contoh, anda ingin memanggil fungsi pada setiap vektor dalam tupel, dilambangkan sebagai "do_something_to_vec
1. Menjana Jujukan Masa Kompilasi Indeks:
Pertama, kita memerlukan cara untuk menjana jujukan indeks yang sepadan dengan kedudukan vektor dalam tupel. Ini boleh dilakukan menggunakan fungsi meta seq dan 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. Menentukan Fungsi Tersuai untuk Menggunakan Fungsi:
Seterusnya, kami mencipta functor yang boleh menggunakan fungsi yang dikehendaki pada setiap vektor. Functor boleh kelihatan seperti ini:
<code class="cpp">struct tuple_vector_functor { template<typename T> void operator () (T const &v) { // Do something on the argument vector... } };</code>
3. Menggunakan Fungsi for_each_in_tuple:
Kini, kita boleh mentakrifkan fungsi generik for_each_in_tuple yang menggunakan fungsi meta seq dan gen_seq untuk mengulangi setiap elemen tupel dan menggunakan functor tersuai kami:
<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. Menggunakan Fungsi pada Tuple of Vectors:
Dalam struct TupleOfVectors anda, anda boleh menggunakan fungsi for_each_in_tuple untuk memanggil fungsi khusus anda pada setiap vektor dalam 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. Contoh Langsung:
Berikut ialah contoh langsung yang menunjukkan cara menggunakan penyelesaian: https://godbolt.org/z/q4wXTqPa6
Nota:
Jika anda menggunakan C 14 atau lebih baru, anda boleh menggantikan fungsi meta seq dan gen_seq dengan std::integer_sequence. Untuk C 17 dan seterusnya, penyelesaian yang lebih mudah menggunakan std::apply adalah mungkin:
<code class="cpp">std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);</code>
Atas ialah kandungan terperinci Bagaimanakah anda boleh menggunakan metaprogramming templat C untuk menggunakan fungsi tertentu pada setiap vektor dalam satu tuple vektor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!