fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4.  
  5. template <typename ...Ts>
  6. void f(const Ts& ...args) {
  7. int dummy[] = {0, ((std::cout << args << " "), 0)...};
  8. static_cast<void>(dummy); // Avoid warning
  9. }
  10.  
  11.  
  12. namespace detail
  13. {
  14.  
  15. template <typename T>
  16. decltype(auto) call_a_b(std::integral_constant<std::size_t, 0u>, const T& arg) {return arg.a();}
  17.  
  18. template <typename T>
  19. decltype(auto) call_a_b(std::integral_constant<std::size_t, 1u>, const T& arg) {return arg.b();}
  20.  
  21. template <std::size_t... Is, typename Tuple>
  22. void call_f_a_b(std::index_sequence<Is...>, const Tuple& tuple)
  23. {
  24. f(call_a_b(std::integral_constant<std::size_t, Is % 2>{}, std::get<Is / 2>(tuple))...);
  25. }
  26.  
  27. }
  28.  
  29. template <typename...Ts>
  30. void g(const Ts&... args)
  31. {
  32. return detail::call_f_a_b(std::make_index_sequence<2 * sizeof...(Ts)>{}, std::tie(args...));
  33. // call f(arg0.a(), arg0.b(), arg1.a(), arg1.b(), ...)
  34. }
  35.  
  36. struct S {
  37. int a() const { return 42; }
  38. float b() const { return 4.2f; }
  39. };
  40.  
  41. int main()
  42. {
  43. g(S());
  44. }
  45.  
  46.  
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
42 4.2