Maison >développement back-end >C++ >Comment pouvez-vous utiliser la métaprogrammation de modèles pour parcourir les éléments de tuple et appliquer une fonction spécifique à chacun en C ?
Utiliser des fonctions pour parcourir les éléments d'un tuple
En C , nous rencontrons souvent du code qui implique d'opérer sur chaque élément d'un tuple. L'extrait suivant met en évidence un scénario dans lequel nous souhaitons personnaliser ce processus :
<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>
L'objectif est de parcourir les éléments du tuple et d'appliquer une fonction spécifique à chacun. Ce modèle est couramment rencontré lors du traitement de structures de données avec des vecteurs de longueur variable.
Adoption de la métaprogrammation de modèles
Pour obtenir cette fonctionnalité, nous pouvons exploiter la métaprogrammation de modèles, en particulier le ' modèle for_each'. Cette approche repose sur la génération de séquences d'entiers au moment de la compilation pour servir d'indices pour les éléments du tuple.
<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>
Application du modèle de foncteur
Ensuite, nous introduisons les modèles de fonction pour parcourir les éléments du tuple :
<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>
Personnalisation du tuple de vecteurs
Enfin, nous intégrons ce mécanisme 'for_each_in_tuple' dans notre structure '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>
Cette solution offre un moyen efficace et flexible d'opérer sur chaque élément d'un tuple, ce qui en fait un outil puissant pour les tâches complexes de traitement de données en C .
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!