c++ - c ++ - 模板元组 - 在每个元素上调用一个函数

我的问题是:


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 类模板封装):


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 函数:


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


}



下面是一个实时示例

在具体情况下,这就是你可以使用它的方式:


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...


 }


 };


};



live example

在C++17中,你可以这样做:


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



假设some_function对元组中的所有类型都有合适的重载。

这已经在 Clang++ 3.9中使用,使用 std::experimental::apply

除了 @M.的答案


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



( live live live ) 。

...