#include <iostream>
#include <typeinfo>
struct A {};
struct B {};
struct C {};
struct D {};
struct E {};
struct F
{
template <typename T>
void operator () (T&& t) {
std::cout << typeid(t).name() << std::endl;
}
};
template <typename F, typename...Ts>
void apply(F f, Ts&&...args) {
const int dummy[] = { (f(std::forward<Ts>(args)), 0)... };
static_cast<void>(dummy); // avoid warning about unused variable.
}
int main() {
A a;
B b;
C c;
D d;
E e;
apply(F{}, a, b, c, d, e);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CgpzdHJ1Y3QgQSB7fTsKc3RydWN0IEIge307CnN0cnVjdCBDIHt9OwpzdHJ1Y3QgRCB7fTsKc3RydWN0IEUge307CgpzdHJ1Y3QgRgp7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHZvaWQgb3BlcmF0b3IgKCkgKFQmJiB0KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHR5cGVpZCh0KS5uYW1lKCkgPDwgc3RkOjplbmRsOwogICAgfQoKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZS4uLlRzPgp2b2lkIGFwcGx5KEYgZiwgVHMmJi4uLmFyZ3MpIHsKICAgIGNvbnN0IGludCBkdW1teVtdID0geyAoZihzdGQ6OmZvcndhcmQ8VHM+KGFyZ3MpKSwgMCkuLi4gfTsKICAgIHN0YXRpY19jYXN0PHZvaWQ+KGR1bW15KTsgLy8gYXZvaWQgd2FybmluZyBhYm91dCB1bnVzZWQgdmFyaWFibGUuCn0KCmludCBtYWluKCkgewoKICAgIEEgYTsKICAgIEIgYjsKICAgIEMgYzsKICAgIEQgZDsKICAgIEUgZTsKCiAgICBhcHBseShGe30sIGEsIGIsIGMsIGQsIGUpOwogICAgcmV0dXJuIDA7Cn0K