我有一个C++11元组,我想得到一个std::reference_wrapper s的元组到元组中相同的元素,有简单的方法吗?
std::reference_wrapper
pwuypxnk1#
给定a pack of indices,Map元组是容易的,例如:
#include <tuple> #include <functional> #include <iostream> template <int...> struct Seq {}; template <int n, int... s> struct Gens : Gens<n-1, n-1, s...> {}; template <int... s> struct Gens<0, s...> { typedef Seq<s...> Type; }; // The above are taken from https://stackoverflow.com/q/7858817
使用索引,我们可以使用std::get将std::ref应用于元组的每个元素:
std::get
std::ref
template <int... s, typename Tuple> auto ref_tuple_impl(Seq<s...> seq, Tuple& tup) -> std::tuple< std::reference_wrapper< typename std::tuple_element<s, Tuple>::type >... > { return std::make_tuple(std::ref(std::get<s>(tup))...); } template <typename Tuple> auto ref_tuple(Tuple& tup) -> decltype( ref_tuple_impl(typename Gens<std::tuple_size<Tuple>::value>::Type>(), tup) ) { return ref_tuple_impl(typename Gens<std::tuple_size<tuple>::value>::Type(), tup); }
使用演示:
int main() { auto t = std::make_tuple(1, 4.5, "66"); auto rt = ref_tuple(t); std::get<0>(rt).get() = 123; std::get<1>(rt).get() = 5.67; std::get<2>(rt).get() = "34"; std::cout << std::get<0>(t) << std::endl; std::cout << std::get<1>(t) << std::endl; std::cout << std::get<2>(t) << std::endl; }
1条答案
按热度按时间pwuypxnk1#
给定a pack of indices,Map元组是容易的,例如:
使用索引,我们可以使用
std::get
将std::ref
应用于元组的每个元素:使用演示: