fork download
  1. #include <iostream>
  2. #include <tuple>
  3.  
  4. namespace detail
  5. {
  6.  
  7. template<std::size_t...IsN, std::size_t...Is, typename F>
  8. void forEachNArgsImpl(std::index_sequence<IsN...>, std::index_sequence<Is...>, F) { }
  9.  
  10. template<std::size_t...IsN, std::size_t...Is, typename F, typename... Ts>
  11. void forEachNArgsImpl(std::index_sequence<IsN...> isn, std::index_sequence<Is...>, F f, Ts... mXs)
  12. {
  13. f(std::get<IsN>(std::forward_as_tuple(std::forward<Ts>(mXs)...))...);
  14. constexpr std::size_t N = sizeof...(IsN);
  15. constexpr std::size_t is = sizeof...(Is);
  16. forEachNArgsImpl(isn,
  17. std::make_index_sequence<(is > N) ? sizeof...(Is) - N : 0>{},
  18. f,
  19. std::get<N + Is>(std::forward_as_tuple(std::forward<Ts>(mXs)...))...);
  20. }
  21.  
  22. }
  23.  
  24. template<std::size_t N, typename F, typename... Ts> void forEachNArgs(F f, Ts... args)
  25. {
  26. static_assert(sizeof...(Ts) % N == 0, "Wrong number of arguments");
  27. detail::forEachNArgsImpl(std::make_index_sequence<N>{}, std::make_index_sequence<sizeof...(Ts) - N>{}, f, std::forward<Ts>(args)...);
  28. }
  29.  
  30.  
  31. int main()
  32. {
  33. int result{0};
  34. forEachNArgs<2>([&result](auto a1, auto a2)
  35. {
  36. result += (a1 * a2);
  37. }, 2, 4, 3, 6);
  38.  
  39. std::cout << result << std::endl;
  40. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
26