#include <iostream>
#include <tuple>
#include <type_traits>
template <typename ...Ts>
void f(const Ts& ...args) {
int dummy[] = {0, ((std::cout << args << " "), 0)...};
static_cast<void>(dummy); // Avoid warning
}
namespace detail
{
template <typename T>
decltype(auto) call_a_b(std::integral_constant<std::size_t, 0u>, const T& arg) {return arg.a();}
template <typename T>
decltype(auto) call_a_b(std::integral_constant<std::size_t, 1u>, const T& arg) {return arg.b();}
template <std::size_t... Is, typename Tuple>
void call_f_a_b(std::index_sequence<Is...>, const Tuple& tuple)
{
f(call_a_b(std::integral_constant<std::size_t, Is % 2>{}, std::get<Is / 2>(tuple))...);
}
}
template <typename...Ts>
void g(const Ts&... args)
{
return detail::call_f_a_b(std::make_index_sequence<2 * sizeof...(Ts)>{}, std::tie(args...));
// call f(arg0.a(), arg0.b(), arg1.a(), arg1.b(), ...)
}
struct S {
int a() const { return 42; }
float b() const { return 4.2f; }
};
int main()
{
g(S());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlIDx0eXBlbmFtZSAuLi5Ucz4Kdm9pZCBmKGNvbnN0IFRzJiAuLi5hcmdzKSB7CiAgICBpbnQgZHVtbXlbXSA9IHswLCAoKHN0ZDo6Y291dCA8PCBhcmdzIDw8ICIgIiksIDApLi4ufTsKICAgIHN0YXRpY19jYXN0PHZvaWQ+KGR1bW15KTsgLy8gQXZvaWQgd2FybmluZwp9CgoKbmFtZXNwYWNlIGRldGFpbAp7CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBkZWNsdHlwZShhdXRvKSBjYWxsX2FfYihzdGQ6OmludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAwdT4sIGNvbnN0IFQmIGFyZykge3JldHVybiBhcmcuYSgpO30KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIGRlY2x0eXBlKGF1dG8pIGNhbGxfYV9iKHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDF1PiwgY29uc3QgVCYgYXJnKSB7cmV0dXJuIGFyZy5iKCk7fQoKICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJcywgdHlwZW5hbWUgVHVwbGU+CiAgICB2b2lkIGNhbGxfZl9hX2Ioc3RkOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4sIGNvbnN0IFR1cGxlJiB0dXBsZSkKICAgIHsKICAgICAgICBmKGNhbGxfYV9iKHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIElzICUgMj57fSwgc3RkOjpnZXQ8SXMgLyAyPih0dXBsZSkpLi4uKTsKICAgIH0KCn0KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLlRzPgp2b2lkIGcoY29uc3QgVHMmLi4uIGFyZ3MpCnsKICAgIHJldHVybiBkZXRhaWw6OmNhbGxfZl9hX2Ioc3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPDIgKiBzaXplb2YuLi4oVHMpPnt9LCBzdGQ6OnRpZShhcmdzLi4uKSk7CiAgICAvLyBjYWxsIGYoYXJnMC5hKCksIGFyZzAuYigpLCBhcmcxLmEoKSwgYXJnMS5iKCksIC4uLikKfQoKc3RydWN0IFMgewogICAgaW50IGEoKSBjb25zdCB7IHJldHVybiA0MjsgfQogICAgZmxvYXQgYigpIGNvbnN0IHsgcmV0dXJuIDQuMmY7IH0KfTsKCmludCBtYWluKCkKewogICAgZyhTKCkpOwp9Cgo=