ホームページ  >  記事  >  バックエンド開発  >  メタプログラミングを使用してベクトルのタプル内の各要素に関数を適用するにはどうすればよいですか?

メタプログラミングを使用してベクトルのタプル内の各要素に関数を適用するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 11:10:02779ブラウズ

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

テンプレート タプル: 各要素で関数を呼び出す

目的は、テンプレート タプル 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。