fork(3) download
  1. #include <tuple>
  2. #include <iostream>
  3.  
  4. namespace details
  5. {
  6. template<typename Int, typename, Int Begin, bool Increasing>
  7. struct integer_range_impl;
  8.  
  9. template<typename Int, Int... N, Int Begin>
  10. struct integer_range_impl<Int, std::integer_sequence<Int, N...>, Begin, true> {
  11. using type = std::integer_sequence<Int, N+Begin...>;
  12. };
  13.  
  14. template<typename Int, Int... N, Int Begin>
  15. struct integer_range_impl<Int, std::integer_sequence<Int, N...>, Begin, false> {
  16. using type = std::integer_sequence<Int, Begin-N...>;
  17. };
  18. }
  19.  
  20. template<typename Int, Int Begin, Int End>
  21. using integer_range = typename details::integer_range_impl<
  22. Int,
  23. std::make_integer_sequence<Int, (Begin<End) ? End-Begin : Begin-End>,
  24. Begin,
  25. (Begin<End) >::type;
  26.  
  27. template<std::size_t Begin, std::size_t End>
  28. using index_range = integer_range<std::size_t, Begin, End>;
  29.  
  30. template<size_t N, class Tuple, class Func>
  31. void tuple_call_assign(Tuple&& source, Tuple&& target, Func f)
  32. {
  33. std::get<N>(std::forward<Tuple>(target)) = f(std::get<N>(std::forward<Tuple>(source)));
  34. }
  35.  
  36. template<size_t From, size_t To, class Tuple, class Func, size_t...Is>
  37. void tuple_transform(Tuple&& source, Tuple&& target, Func f, std::index_sequence<Is...>)
  38. {
  39. using expander = int[];
  40. (void)expander { 0, ((void)tuple_call_assign<Is>(source,target,f), 0)... };
  41. }
  42.  
  43. template<size_t From, size_t To, class Tuple, class Func>
  44. void tuple_transform(Tuple&& source, Tuple&& target, Func f)
  45. {
  46. tuple_transform<From,To>(std::forward<Tuple>(source), std::forward<Tuple>(target), f,
  47. index_range<From,To>());
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53. std::tuple<int,int,int> a = std::make_tuple(1,2,3);
  54. std::tuple<int,int,int> b;
  55. tuple_transform<0,3>(a,b,[](int a){return a*2;});
  56. std::cout << std::get<0>(b);
  57. std::cout << std::get<1>(b);
  58. std::cout << std::get<2>(b);
  59. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
246