首页 > 后端开发 > C++ > 正文

如何使用元编程将函数应用于向量元组中的每个元素?

Barbara Streisand
发布: 2024-10-30 11:10:02
原创
779 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!