#include <iostream>
#include <utility>
struct pseudo_void {};
template <typename T>
struct N;
template <typename T>
struct N<T()> {
T operator()(T(&t)()) {
return t();
}
};
template <typename T, typename ... F>
struct N<T(F...)> {
T operator()(T (&t)(F...), F &&... f) {
return t(std::forward<F>(f)...);
}
};
template <typename ...F>
struct N<void(F...)> {
pseudo_void operator()(void (& t)(F...), F &&... f) {
t(std::forward<F>(f)...);
return pseudo_void();
}
};
template <>
struct N<void()> {
pseudo_void operator()(void (& t)()) {
t();
return pseudo_void();
}
};
std::ostream & operator<< (std::ostream & os, const pseudo_void &) {
return os;
}
void f(int) {}
int main() {
N<void(int)> n;
n(f, 4);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBwc2V1ZG9fdm9pZCB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgTjsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgTjxUKCk+IHsKICAgIFQgb3BlcmF0b3IoKShUKCZ0KSgpKSB7CiAgICAgICAgcmV0dXJuIHQoKTsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi4gRj4Kc3RydWN0IE48VChGLi4uKT4gewogICAgVCBvcGVyYXRvcigpKFQgKCZ0KShGLi4uKSwgRiAmJi4uLiBmKSB7CiAgICAgICAgcmV0dXJuIHQoc3RkOjpmb3J3YXJkPEY+KGYpLi4uKTsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSAuLi5GPgpzdHJ1Y3QgTjx2b2lkKEYuLi4pPiB7CiAgICBwc2V1ZG9fdm9pZCBvcGVyYXRvcigpKHZvaWQgKCYgdCkoRi4uLiksIEYgJiYuLi4gZikgewogICAgICAgIHQoc3RkOjpmb3J3YXJkPEY+KGYpLi4uKTsKICAgICAgICByZXR1cm4gcHNldWRvX3ZvaWQoKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBOPHZvaWQoKT4gewogICAgcHNldWRvX3ZvaWQgb3BlcmF0b3IoKSh2b2lkICgmIHQpKCkpIHsKICAgICAgICB0KCk7CiAgICAgICAgcmV0dXJuIHBzZXVkb192b2lkKCk7CiAgICB9Cn07CgpzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiBvcywgY29uc3QgcHNldWRvX3ZvaWQgJikgewogICAgcmV0dXJuIG9zOwp9Cgp2b2lkIGYoaW50KSB7fQoKaW50IG1haW4oKSB7CgogICAgTjx2b2lkKGludCk+IG47CiAgICAKICAgIG4oZiwgNCk7Cgp9