fork download
  1. #include <vector>
  2. #include <tuple>
  3.  
  4. template <int... Is>
  5. struct seq {};
  6.  
  7. template <int N, int... Is>
  8. struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};
  9.  
  10. template <int... Is>
  11. struct gen_seq<0, Is...> : seq<Is...> {};
  12.  
  13. template <typename... T, int... Is>
  14. auto transpose(std::tuple<std::vector<T>...>& var, seq<Is...>)
  15. -> std::vector<std::tuple<T...>>
  16. {
  17. std::vector<std::tuple<T...>> result;
  18. for (std::size_t i = 0; i < std::get<0>(var).size(); i++)
  19. {
  20. std::tuple<T...> t = std::make_tuple(std::get<Is>(var)[i]...);
  21. result.push_back(t);
  22. }
  23.  
  24. return result;
  25. }
  26.  
  27. template <typename... T, int... Is>
  28. auto transpose(std::tuple<std::vector<T>...>& var)
  29. -> std::vector<std::tuple<T...>>
  30. {
  31. return transpose(var, gen_seq<sizeof...(T)>());
  32. }
  33.  
  34. #include <iostream>
  35. #include <iomanip>
  36.  
  37. int main()
  38. {
  39. std::vector<int> vi = {42, 1729, 6};
  40. std::vector<bool> vb = {true, false, false};
  41. std::vector<std::string> vs = {"Hi", "Hey", "Ho"};
  42. auto t = make_tuple(vi, vb, vs);
  43. auto v = transpose(t);
  44.  
  45. std::cout << std::boolalpha;
  46. for (auto const& t : v)
  47. {
  48. std::cout << "(";
  49. std::cout << std::get<0>(t);
  50. std::cout << ", " << std::get<1>(t);
  51. std::cout << ", " << std::get<2>(t);
  52. std::cout << ")" << std::endl;
  53. }
  54. }
  55.  
Success #stdin #stdout 0s 2992KB
stdin
Standard input is empty
stdout
(42, true, Hi)
(1729, false, Hey)
(6, false, Ho)