模板元组

编程入门 行业动态 更新时间:2024-10-24 22:25:50
本文介绍了模板元组-在每个元素上调用一个函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我的问题在代码中:

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 } };

推荐答案

您可以使用某些索引机制轻松地做到这一点。给定一个元函数 gen_seq 用于生成编译时整数序列(由 seq 类模板封装):

You can quite easily do that with some indices machinery. Given a meta-function gen_seq for generating compile-time integer sequences (encapsulated by the seq class template):

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...> { }; }

以及以下功能模板:

#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)>()); }

您可以使用上面的 for_each_in_tuple 函数这样:

You can use the for_each_in_tuple function above this way:

#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()); }

这里是 实时示例 。

在您的具体情况下,可以使用以下方法:

In your concrete situation, this is how you could use it:

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) { // Do something on the argument vector... } }; };

再一次,这是一个 实时示例 。

如果您使用的是 C ++ 14 或更高版本,则可以替换 seq 和 gen_seq 上面带有 std :: integer_sequence 像这样:

If you're using C++14 or later, you can replace the seq and gen_seq classes above with std::integer_sequence like so:

namespace detail { template<typename T, typename F, int... Is> void for_each(T&& t, F f, std::integer_sequence<int, Is...>) { auto l = { (f(std::get<Is>(t)), 0)... }; } } // namespace detail template<typename... Ts, typename F> void for_each_in_tuple(std::tuple<Ts...> const& t, F f) { detail::for_each(t, f, std::make_integer_sequence<int, sizeof...(Ts)>()); }

如果您使用的是 C ++ 17 或更高版本,为此(来自下面的评论):

If you're using C++17 or later you can do this (from this comment below):

std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);

更多推荐

模板元组

本文发布于:2023-11-26 21:08:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1635202.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模板

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!