fork(1) download
  1. #include <utility>
  2. #include <tuple>
  3. #include <iostream>
  4.  
  5.  
  6. template <std::size_t I, typename F, typename ...Tuples>
  7. constexpr F for_each_tuple_variadic_impl2(F&& f, Tuples&& ...tuples)
  8. {
  9. return std::forward<F>(f)((std::get<I>(std::forward<Tuples>(tuples)))...), f;
  10. }
  11.  
  12. template <typename F, std::size_t... I, typename ...Tuples>
  13. constexpr F for_each_tuple_variadic_impl(F&& f, std::index_sequence<I...>, Tuples&& ...tuples)
  14. {
  15. return (for_each_tuple_variadic_impl2<I>(std::forward<F>(f), std::forward<Tuples>(tuples)...), ...), f;
  16. }
  17.  
  18. template<typename Tuple1, typename... OtherTuples >
  19. struct tuple_size_helper
  20. {
  21. static const std::size_t value = std::tuple_size<std::remove_reference_t<Tuple1>>::value;
  22. };
  23.  
  24. template <typename F, typename ...Tuples>
  25. constexpr F for_each_variadic(F&& f, Tuples&& ...tuples)
  26. {
  27. return for_each_tuple_variadic_impl(
  28. std::forward<F>(f),
  29. std::make_index_sequence<tuple_size_helper<Tuples...>::value>{},
  30. std::forward<Tuples>(tuples)...);
  31. }
  32.  
  33. int main()
  34. {
  35. for_each_variadic([](auto a1, auto a2, auto a3){
  36. std::cout<<a1<<", "<<a2<<", "<<a3<<std::endl;
  37. }, std::make_tuple(1,'c'), std::make_tuple("str",220), std::make_tuple(1.5,380));
  38. return 0;
  39. }
Success #stdin #stdout 0s 4504KB
stdin
Standard input is empty
stdout
1, str, 1.5
c, 220, 380