Maison > développement back-end > C++ > Comment appliquer une fonction à chaque élément d'un tuple de vecteurs à l'aide de la métaprogrammation ?

Comment appliquer une fonction à chaque élément d'un tuple de vecteurs à l'aide de la métaprogrammation ?

Barbara Streisand
Libérer: 2024-10-30 11:10:02
original
951 Les gens l'ont consulté

How to Apply a Function to Each Element in a Tuple of Vectors Using Metaprogramming?

Tuple de modèle : appeler une fonction sur chaque élément

Votre objectif est d'invoquer une fonction sur chaque élément d'un tuple de modèle std : tuple...>. Dans la structure TupleOfVectors, vous cherchez à implémenter la méthode do_something_to_each_vec, qui parcourt chaque vecteur membre et exécute une fonction spécifique sur eux.

Solution

Utiliser des méta- les techniques de programmation peuvent relever ce défi avec élégance. Avec une méta-fonction gen_seq qui produit des séquences de compilation et des modèles de fonctions compagnons, vous pouvez implémenter les machines suivantes :

<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>
Copier après la connexion
<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>
Copier après la connexion

Vous pouvez exploiter for_each_in_tuple comme illustré ci-dessous :

<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>
Copier après la connexion

Dans votre cas, vous pouvez l'utiliser comme suit :

<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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal