Utilisation d'un modèle de fonction pour manipuler des éléments de tuple
Imaginez un scénario dans lequel vous avez un tuple contenant différents types de vecteurs et souhaitez effectuer des opérations spécifiques sur chaque vecteur. Par exemple, vous souhaitez appeler une fonction sur chaque vecteur du tuple, notée "do_something_to_vec
1. Génération d'une séquence d'indices au moment de la compilation :
Tout d'abord, nous avons besoin d'un moyen de générer une séquence d'indices qui correspondra aux positions des vecteurs dans le tuple. Cela peut être fait en utilisant les méta-fonctions seq et 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. Définition d'un foncteur personnalisé pour appliquer la fonction :
Ensuite, nous créons un foncteur qui peut appliquer la fonction souhaitée à chaque vecteur. Le foncteur pourrait ressembler à ceci :
<code class="cpp">struct tuple_vector_functor { template<typename T> void operator () (T const &v) { // Do something on the argument vector... } };</code>
3. Utilisation de la fonction for_each_in_tuple :
Maintenant, nous pouvons définir une fonction générique for_each_in_tuple qui utilise les méta-fonctions seq et gen_seq pour parcourir chaque élément du tuple et appliquer notre foncteur personnalisé :
<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. Application de la fonction au tuple de vecteurs :
Dans votre structure TupleOfVectors, vous pouvez utiliser la fonction for_each_in_tuple pour appeler votre fonction spécifique sur chaque vecteur du 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. Exemple en direct :
Voici un exemple en direct montrant comment utiliser la solution : https://godbolt.org/z/q4wXTqPa6
Remarque :
Si vous utilisez C 14 ou version ultérieure, vous pouvez remplacer les méta-fonctions seq et gen_seq par std::integer_sequence. Pour C 17 et au-delà, une solution encore plus simple utilisant std::apply est possible :
<code class="cpp">std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!